RedisのRDBを「なんとなく」使うな:システムを破綻させないための極限のアーキテクチャ設計
Redisを扱う上で、RDB(Redis Database Backup)は避けては通れない機能だ。しかし、多くのエンジニアはRDBの仕様を「データの保存場所」としか捉えていない。
これが大きな間違いだ。RDBは単なる保存機能ではなく、「システムのパフォーマンス」と「障害時の復旧時間(RTO)」を天秤にかける、極めて戦略的なアーキテクチャ決定である。
今日は、RDBの深淵を覗き、実務で絶対にやってはいけない設計と、プロとして守るべき黄金律を伝授しよう。
—
1. RDBの挙動:`fork()` という諸刃の剣
RDBの本質は、Redisがバックアップを作成する際に発生する `fork()` システムコールにある。
RedisがRDBを生成する際の流れ
1. fork() を呼び出し、子プロセスを生成
2. 子プロセスがメモリ上の全データをディスクに書き出す
3. 親プロセスはリクエストを処理し続ける(Copy-on-Writeの恩恵)
ここで重要なのは、「メモリが大きくなればなるほど、`fork()` の負荷は指数関数的に増大する」という事実だ。データセットが数十GBに達している場合、`fork()` 時にRedisが数秒から数十秒単位でブロックされる可能性がある。
設計レビューでの指摘事項:
「データセットが大きい環境で、短期間のRDB設定(例: 60秒に1回)を行っていないか?」
これを行うと、Redisはバックアップのループに陥り、レスポンスタイムが崩壊する。運用負荷とトレードオフを正確に計算せよ。
—
2. 実務的なバックアップ戦略:堅牢な設計パターン
RDBはあくまで「ポイントインタイム」のバックアップだ。これ単体で運用するのは推奨しない。以下の3層構造を標準とせよ。
A. RDBは「災害復旧」の切り札として使う
RDBの保存間隔は、「どれだけのデータ消失が許容できるか」で決定する。
redis.conf の設定例:ビジネスインパクトを考慮した構成
15分に1回、少なくとも1つのキーが変更されたら保存
save 900 1
5分に1回、10キー以上の変更で保存
save 300 10
B. AOF(Append Only File)との併用
RDBだけでは、前回のバックアップ以降のデータがすべて消える。Redisの可用性を担保したいなら、AOFを併用し、`appendfsync everysec` を適用するのが現代のデファクトだ。
C. 外部ストレージへの隔離
RDBファイル(`dump.rdb`)を、Redisを動かしているインスタンスと同じディスクに置いてはいけない。インスタンスが死ねばバックアップも消える。
【推奨設計】
1. RDB生成後、cron等で別リージョンのS3や堅牢なバックアップストレージへ転送する。
2. その際、`rdb-save-incremental-fsync` を有効にし、I/O負荷を平準化する。
—
3. パフォーマンスを殺さないための「禁じ手」
現場でよく見る「最悪のアンチパターン」を挙げる。これだけは避けてほしい。
- `save` コマンドを叩くな:
`save` は同期的に実行される。本番環境でこれを打てば、その瞬間からRedisは完全にフリーズする。バックアップが必要なら必ず `bgsave` を使うこと。
- メモリの限界を知れ:
`fork()` はメモリのページテーブルをコピーする。Redisが確保しているメモリ量の少なくとも2倍の空き物理メモリがなければ、OSレベルでOOM Killerに殺されるリスクがある。
- `vm.overcommit_memory = 1` を忘れるな:
Linuxのカーネル設定で、メモリオーバーコミットを許可していないと `fork()` は失敗する。これもRedisの運用では必須のチューニングだ。
—
4. チーフアーキテクトからの提言
Redisを単なる「高速なKVS」として使うのは簡単だが、「いかにしてデータを失わず、かつレイテンシを最小化するか」を突き詰めるのがエンジニアの腕の見せ所だ。
今すぐ確認すべきチェックリスト:
1. 自分のRedisのデータセットサイズを把握しているか?
2. `bgsave` が発生した際のレイテンシスパイクを監視(`info stats` の `latest_fork_usec`)しているか?
3. `dump.rdb` を別の物理筐体に退避させるパイプラインが構築されているか?
RDBは、いわばシステムの「セーブポイント」だ。適当な設定でゲームを続けるな。自分のシステムの特性(書き込み頻度、データ量、ビジネス上の許容RPO)を分析し、最適なバランスを見極めてほしい。
もし、設定に迷ったらこう考えろ。「もし今、この瞬間にデータが消えたら、誰が一番困るのか?」 その答えが、君が設定すべき `save` 間隔だ。
健闘を祈る。
コメント