Redis持久化失败、MISCONF RedisはRDBスナップショットを保存するように構成されていますが、現在は保持できませんo

1.エラーの説明

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

Redisログの説明:

21222:C 25 Feb 03:58:01.811 * RDB: 70 MB of memory used by copy-on-write
797:M 25 Feb 03:58:01.825 * Background saving terminated with success
797:M 25 Feb 04:03:02.100 * 10 changes in 300 seconds. Saving...
797:M 25 Feb 04:03:02.101 # Can't save in background: fork: Cannot allocate memor

2.RBD永続化方式

redisがdump.rdbファイルを保存するとき:

  1. まず、親プロセスが子プロセスをフォークします。この時点で、redisは親プロセスと子プロセスを所有しています。
  2. 子プロセスは、データセットを一時的なrdbファイルに書き込みます
  3. ただし、子プロセスが新しいrdbを書き込んだ後、redisは古いrdbファイルを新しいファイルに置き換えてから、古いファイルを削除します。

この作業方法により、Redisはコピーオンライトメカニズムの恩恵を受けることができます。

3.エラー分析

Redisがデータをダンプすると、子プロセスをフォークします。理論的には、子プロセスが占有するメモリは親のメモリと同じです。たとえば、親が占有するメモリは8Gです。このとき、8Gのメモリが必要です。子にも割り当てられます。手ごろな価格ではないため、redisサーバーがダウンしたり、IO負荷が高すぎたりして、効率が低下することがよくあります。したがって、ここでのより最適化されたメモリ割り当て戦略は1に設定する必要があります(現在のメモリ状態に関係なく、カーネルがすべての物理メモリの割り当てを許可することを示します)。

メモリ割り当て戦略パラメータ

Overcommit_memoryパラメーターの説明:メモリ割り当て戦略を設定し(オプション、サーバーの実際の状況に応じて設定)、オプションの値:0、1、2。

  • 0:カーネルは、アプリケーションプロセスに使用可能なメモリが十分にあるかどうかを確認します。使用可能なメモリが十分にある場合は、メモリアプリケーションが許可されます。それ以外の場合、メモリアプリケーションは失敗し、アプリケーションプロセスにエラーが返されます。
  • 1:現在のメモリステータスに関係なく、カーネルがすべての物理メモリの割り当てを許可することを示します。
  • 2:カーネルがすべての物理メモリとスワップスペースの合計を超えるメモリの割り当てを許可することを示します。

3.解決策

  1. 永続的な例外を無視して、書き込みを続行します
    xxx> config set stop-writes-on-bgsave-error no
  2. Linuxのメモリ割り当て戦略を変更する
    vim /etc/sysctl.conf
    # ---
    vm.overcommit_memory = 1
    

おすすめ

転載: blog.csdn.net/JAYU_37/article/details/107093321