Redis踩坑-MISCONFRedisはRDBスナップショットを保存するように構成されていますが、現在は永続化できません

最近、プロジェクトがTencent Cloudにデプロイされ、プロジェクトのデータキャッシングにredisが使用されました。3日間は問題なく動作しましたが、4日目にWebサイトの特定のページに入ると、バグが発生しました。スクリーンショットは次のとおりです。

 

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool


例外は、jedisに接続できないことを示しています。サーバーでredisの動作を確認したところ、redisがまだ実行中であることがわかりました。その後、テストのためにredisにpingを実行しようとすると、次のエラーが発生しました。

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk

 意味:Redisはデータベーススナップショットを保存するように構成されていますが、現在ディスクに永続化することはできません。収集データの変更に使用するコマンドは使用できません。詳細なエラーメッセージについては、Redisログを確認してください。

私はこの問題を探すためにインターネットに行きました、そしてインターネットは理由がRedisスナップショットを強制的に持続することができないということであると言いました。与えられた解決策は、config set stop-writes-on-bgsave-error noコマンドを実行した後、構成アイテムstop-writes-on-bgsave-errorを閉じて問題を解決することです。

root@ubuntu:/usr/local/redis/bin# ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no


上記の操作を完了した後、Webページをもう一度更新してください〜それは本当にうまくいきます、素晴らしいです!それから私は眠りについた。

しかし、2日後に再びウェブサイトがクラッシュしました〜問題は上記と同じなので、インターネットにアクセスして解決策を見つけ、この記事(https://www.cnblogs.com/qq78292959/ )で解決策を見つけました。 p / 3994349 .html

この記事によると、config set stop-writes-on-bgsave-errorをnoに設定すると、redisはこの例外を無視するため、プログラムは引き続き実行できますが、実際にはデータはハードディスクに保存されません。

redisログを見ると、警告の行が見つかります。

「警告overcommit_memoryが0に設定されています!メモリ不足の状態でバックグラウンド保存が失敗する可能性があります。この問題を修正するには、「vm.overcommit_memory = 1」を/etc/sysctl.confに追加してから、再起動するか、コマンド「sysctlvm.overcommit_memory=1」を実行します。 'これを有効にするには。"(警告:メモリのオーバーコミットは0に設定されています!メモリ不足の環境ではバックグラウンド保存が失敗する場合があります。これを修正するには、エントリ' vm.overcommit_memory = 1'を追加してから、再起動します(またはコマンドを実行します' sysctl vm.overcommit_memory = 1')を有効にします。)

システムメモリが不足していることを意味します。システムメモリの空き容量-mを確認しましたが、明らかにメモリがたくさんあります。

 

ぼんやりと、vm.overcommit_memory = 1の変更に従い、問題は解決しました。問題があります。システムメモリが十分であることは明らかですが、redisがredisのメモリが不足していると考えるのはなぜですか。上記のリンクの記事には、問題の原因の分析も記載されています

Redisはメモリ不足の理由を考えています:[記事に参加:  Redisのデータ損失から開始]、簡単に言えば:Redisは、データを保存するときにメインプロセスのアニメーションが中断されないように、メインプロセスのコピーをフォークする必要がありますハードディスクを作成し、フォークプロセスでデータを完成させるハードディスクに保存する操作で、メインプロセスが4GBのメモリを使用する場合、子プロセスをフォークするときに追加の4GBが必要になります。このとき、メモリは次のようになります。十分ではなく、フォークが失敗し、ハードディスクへのデータ保存も失敗します。

そして、vm.overcommit_memoryを1に変更するとどのような影響がありますか?インターネットで次の説明のあるブログを見ましたが、個人的には同意します。

0 —デフォルト設定。個人的な理解:アプリケーションプロセスがメモリを申請しようとすると、カーネルがテストを実行します。カーネルは、アプリケーションプロセスが使用するのに十分な空きメモリがあるかどうかを確認します。十分な空きメモリがある場合は、メモリアプリケーションが許可されます。そうでない場合、メモリアプリケーションは失敗し、エラーがアプリケーションプロセスに返されます。たとえば、1Gマシンの場合、プロセスAは500Mを使用しました。別のプロセスが500Mのメモリをmallocしようとすると、カーネルは残りの使用可能なメモリを超えていることを確認して検出し、失敗を促します。
1 —メモリアプリケーション要求の場合、カーネルは物理メモリが使い果たされるまでチェックを行わず、OOMをトリガーしてユーザーモードプロセスを強制終了します。上記の例と同じです。1Gマシン、Aプロセス500M、Bプロセスは500Mをmallocしようとしますが、成功しますが、カーネルがメモリ使用量が1 Gに近いことを検出すると(カーネルにはポリシーがあります)、トリガーされますOOMし、いくつかのユーザーモードを強制終了します。プロセス(戦術的に強制終了)。
2 —要求されたメモリが> =SWAPメモリサイズ+物理メモリ*Nの場合、メモリ要求は拒否されます。このNを説明します。Nはパーセンテージであり、overcommit_ratio / 100に従って決定されます(overcommit_ratio = 50など)。Nは50%です。

おすすめ

転載: blog.csdn.net/liuwei0376/article/details/122714430