「LOADING Redis is loading the dataset in memory」エラーの解決方法

intermediate🔴 Redis2026-04-13| Linux (Ubuntu, CentOS, Debian), Docker, Redis 4.0 以上

Error Message

LOADING Redis is loading the dataset in memory
#redis#devops#データベース最適化#トラブルシューティング

Redis再起動時によくある悩み本番サーバーを再起動したり、設定変更後にRedisサービスを再起動したりした直後を想像してみてください。突然、アプリケーションが応答を停止し、500エラーを返し始めます。ログを確認すると、次のような特定のメッセージで埋め尽くされています。

LOADING Redis is loading the dataset in memory

Redisは動作しているように見えますが、送信したすべてのSETGETINCRコマンドを拒否します。これはクラッシュではありません。データサイズやハードウェアの速度に応じて、10秒から20分ほど続く可能性のある移行状態です。

なぜRedisは応答を拒否するのかRedisはインメモリデータベースです。RAMは揮発性であるため、Redisは定期的にスナップショットをディスクに保存(RDBファイル)したり、すべての書き込み操作をログに記録(AOFファイル)したりして、再起動後もデータが保持されるようにしています。サービスが開始されると、キースペースを再構築するために、これらのデータをRAMに読み戻す必要があります。

このプロセスが実行されている間、Redisは「LOADING」状態に入ります。デフォルトでは、ほぼすべての受信コマンドをブロックします。これによりデータの不整合が防止され、メモリへの読み込み中に不完全なデータや古いデータを読み取ってしまうのを防ぎます。

即時の対応:どのくらいの時間がかかるのか?このエラーで最もストレスがかかるのは、いつ終わるかわからない沈黙です。1分で終わるのか、1時間かかるのか分かりません。幸いなことに、redis-cliを使用して内部状況を覗き見ることができます。データコマンドがブロックされている間でも、通常INFOコマンドはアクセス可能です。

現在のステータスを確認するには、次を実行します。

redis-cli INFO persistence

loadingセクションを探してください。次のような出力が表示されます。

# 永続化
loading:1
loading_start_time:1715832000
loading_expect_filesize:5368709120
loading_loaded_bytes:2147483648
loading_loaded_perc:40.00
loading_eta_seconds:120

次の2つのフィールドに注目してください。

  • loading_loaded_perc: ファイルの何パーセントがすでにメモリに読み込まれたかを正確に示します。- loading_eta_seconds: 残りの待ち時間の概算を提供します。## 「初期化」オプション(緊急時のみ)開発環境であったり、Redis内のデータが単なるキャッシュで、プライマリデータベースから再構築可能であったりする場合もあります。そのようなケースでは、データの整合性よりも速度を優先したいかもしれません。空のデータセットでRedisを即座に強制起動させることができます。 警告:この操作を行うと、現在読み込み中のデータは永久に削除されます。
  • Redisサービスを停止する:sudo systemctl stop redis- データディレクトリ(多くの場合 /var/lib/redis)に移動し、dump.rdb または appendonly.aof ファイルを削除します。- Redisを再起動する:sudo systemctl start redis読み込むファイルがなくなるため、Redisは即座に接続を受け入れられるようになります。

ダウンタイムを短縮するための恒久的な対策大規模なデータセットを扱っている場合、次のクラッシュをただ待つべきではありません。移行をより速くするために、設定を最適化する必要があります。

1. RDBプリアンブルを使用したAOFの有効化生のAppend Only File(AOF)の読み込みは、すべてのコマンドを再実行する必要があるため、非常に遅いことで知られています。最新バージョン(4.0以降)では、ハイブリッドアプローチをサポートしています。これはAOFファイルの先頭にRDBスナップショットを書き込むもので、読み込みが大幅に高速化されます。

redis.confでこれが有効になっていることを確認してください。

aof-use-rdb-preamble yes

2. RDB圧縮の評価圧縮を行うと dump.rdb ファイルは小さくなりますが、起動時にCPUサイクルを消費します。強力なCPUを搭載しているがディスクI/Oが遅い場合は、有効にしたままにしてください。しかし、起動時にCPUがすでに限界に達している場合は、無効にすることで起動時間を数秒短縮できる可能性があります。

rdbcompression no

3. NVMeストレージへのアップグレードRedisの読み込み速度は、ほぼ完全にディスクの読み取りスループットに依存します。loading_loaded_bytes の上昇が遅い場合は、ディスクがボトルネックになっています。標準的なHDDからNVMe SSDに移行することで、10GBのデータセットで5分かかっていた読み込み時間を30秒未満に短縮できる可能性があります。

4. 「大きなキー(Big Keys)」の特定数百万の要素を含む単一のHashやSetは、多数の小さなキーよりも処理に大幅に時間がかかります。これらの「大きなキー」は読み込みプロセスを停滞させます。組み込みのスキャナーを使用してそれらを見つけてください。

redis-cli --bigkeys

100,000以上のフィールドを持つHashが見つかった場合は、メモリ管理を改善するために、より小さなチャンクに分割することを検討してください。

最終確認読み込み率が100%に達すると、Redisはアクティブな状態に移行します。ハートビートを送信して、サービスが正常であることを確認できます。

redis-cli PING

システムが準備完了していれば、シンプルな PONG が返されます。また、ログ(通常は /var/log/redis/redis-server.log)を監視して、最終的な確認を行うこともできます。

* ディスクからDBを読み込みました: 4.567 秒
* 接続の受け入れ準備が完了しました

Related Error Notes