Redisの永続化方式
Redisはデータ保持のためにRDBスナップショットとAOFログの2種類の永続化方式を提供しています。
各方式の特徴
RDB方式:指定した時間間隔でデータの時点スナップショットを生成します。
AOF方式:実行されたすべての書き込みコマンドをログとして記録し、サーバー起動時に再実行してデータを復元します。
AOFログはRedisプロトコル形式で保存され、新規コマンドはファイル末尾に追記されます。バックグラウンドでログの最適化(リライト)が行われるため、実際のデータサイズを超える肥大化を防ぎます。
優先順位と併用
RDBとAOFを同時に有効化した場合、データ復旧時はAOFファイルが優先されます。AOFは通常RDBよりも詳細なデータを保持するためです。データの完全性が最も重要な場合は、AOFをメインに設定することを推奨します。
方式比較
| 方式 | 利点 | 欠点 |
|---|---|---|
| RDB |
|
|
| AOF |
|
|
動作メカニズム
RDBスナップショット生成プロセス:
- fork()で子プロセスを生成
- 子プロセスが一時RDBファイルにデータを書き込み
- 書き込み完了後、既存ファイルを原子的に置換
AOFリライトプロセス:
- fork()で子プロセスを生成
- 子プロセスが新しいログ構造を一時ファイルに作成
- 親プロセスは新規コマンドをメモリバッファに保持
- リライト完了後、バッファ内容を新ログに反映
- 新旧ファイルの原子的置換
設定例
RDBスナップショットのトリガー条件(/etc/redis/redis.conf):
# スナップショット間隔の設定
snapshot-trigger 1200 5 # 20分で5キー変更
snapshot-trigger 600 20 # 10分で20キー変更
snapshot-trigger 120 5000 # 2分で5000キー変更
# ファイル保存設定
snapshot-filename snapshot_6379.rdb
working-directory /var/lib/redis
AOF設定:
append-mode enabled
log-filename operation_log.aof
rewrite-threshold 100mb
操作コマンド
即時スナップショットの実行:
127.0.0.1:6379> SET test_key value
OK
127.0.0.1:6379> BG_SNAPSHOT # バックグラウンドで実行
Snapshot started
BG_SNAPSHOTは子プロセスで処理するため、メインプロセスがブロックされません。SNAPSHOTコマンドは同期処理のため、運用中は推奨されません。異常停止時のデータ復旧では、AOFログを介した再構築が行われます。