この記事では、Redis の 2 つの永続モード (RDB と AOF) の欠点を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
#[関連する推奨事項:Redis ビデオ チュートリアル]
1. RDB 永続モードの欠陥
1. 問題の説明: 同時ルートが 200 あり、シミュレーションは Redis への書き込みを続けます。4 時間後、多数のインターフェイス呼び出しが失敗し始めます。エラー メッセージは次のとおりです:{"data":{"sendResult":null},"base":{"returncode":"99999","returndesc":"系统异常: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."},"qrybase":{"total":0,"count":0,"start":0}}2. 理由分析: エラー メッセージを解釈し、ディスク領域の不足が原因であると考えましたが、以下に示すように、ディスクの 42% が残っていることがわかりました。
#したがって、エラー メッセージに基づいて、Redis ログをオンにしてストレス テストを続行するよう求められます。インターフェイスは依然としてエラーを報告しますが、Redis ログ情報から
バックグラウンドで保存できません: fork: メモリを割り当てられません
プロセスによるメモリの不適切な使用に関連しています。Redis のメイン プロセスが占有しているメモリを次のように確認します: 55% 近くを占有している*4G のメモリ
具体的な理由: Redis がデータをハードディスクに保存するときにメイン プロセスの一時停止アニメーションを回避するには、メイン プロセスのコピーをフォークする必要があります。その後、Fork プロセスでハードディスクへのデータ保存が完了します。メインプロセスが 2.2GB のメモリを使用している場合、子プロセスを Fork するときにさらに 2.2GB が必要になります。このとき、メモリが十分ではなく、Fork は失敗します。データは保存されますが、ハードドライブも故障しました。
3. 軽減策 (問題を根本的に解決できない):
3.1 redis.conf ファイルの構成項目 stop-writes-on-bgsave-error no を変更します (デフォルト値はyes)、つまり、bgsave スナップショット操作でエラーが発生した場合、ディスクへのデータの書き込みを停止します。これにより、後続の書き込みエラーは失敗します。後続の書き込み操作に影響を与えないようにするには、この値を no に変更する必要があります。
3.2 カーネル パラメーターを変更します (以下の 3 つ) 方法)、ただし root 権限が必要です:
(1) 编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效 (2)sysctl vm.overcommit_memory=1 (3)echo 1 > /proc/sys/vm/overcommit_memory2. AOF 永続モードの欠陥
1.問題 1 の説明:
Redis マスター/スレーブ すべてのノードが AOF モードをオンにし、200 の同時接続で、Redis への連続書き込みをシミュレートしました。15 分後、多数のインターフェイス呼び出しが失敗し始め、Linux 仮想Redis が配置されているサーバーがハングしました。
インターフェイス エラーは次のとおりです:
{"data":null,"base":{"returndesc":"系统异常","returncode":"999999"},"qrybase":null} Biz(dubbo)接口报错如下: 2015-06-05 11:28:28.760 [DubboServerHandler-X.X.X.X:20882-thread-173] ERROR - error while validate jedis! redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
原因分析:
ダボ インターフェイス エラー メッセージから、インターフェイス API 操作 Redis タイムアウトが原因であることがわかります。システム ログと IO 監視から判断すると、以下に示すように、上記の問題は IO ボトルネック (システム IO がビジーすぎる) によって引き起こされていることがわかります。
# システム ログからも、IO ブロック時間が 120 秒を超え、システム セキュリティ メカニズムが原因でマシンがハングしていることがわかります。
概要
テスト結果は、AOF モードには最も明らかな欠陥があることを証明しています。つまり、アクセス圧力が高い場合、IO がパフォーマンスのボトルネックとなり、サービスが利用できなくなるということです。3. 軽減策 (問題を根本的に解決できない)
/etc/sysctl.conf を編集し、次の設定を追加します:
vm.dirty_background_ratio = 5 vm.dirty_ratio = 10
次に、sysctl -p で設定を行います。ファイルが有効になります。
問題 2 の説明:
2 つのファイル (.aof または .rdb) のサイズがシステム メモリの 80% を超える場合、AOF モードと RDB (スナップショット モード) のどちらが使用されるかの場合、Redis プロセスはシステムダウンによって強制終了され、サービスが利用できなくなります。
概要
上記の問題は、Redis を使用する場合は、事前にシステム メモリ容量を計画する必要があることを示しています。これは、Redis がクラッシュすると大量のデータが失われ、回復できなくなるためです。
プログラミング関連の知識について詳しくは、
プログラミング ビデオをご覧ください。 !
以上がRedis の RDB および AOF 永続モードの欠陥に関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。