Redis永続化メカニズムの実装と最適化

Redisの永続化方式

Redisはデータ保持のためにRDBスナップショットとAOFログの2種類の永続化方式を提供しています。

各方式の特徴

RDB方式:指定した時間間隔でデータの時点スナップショットを生成します。
AOF方式:実行されたすべての書き込みコマンドをログとして記録し、サーバー起動時に再実行してデータを復元します。

AOFログはRedisプロトコル形式で保存され、新規コマンドはファイル末尾に追記されます。バックグラウンドでログの最適化(リライト)が行われるため、実際のデータサイズを超える肥大化を防ぎます。

優先順位と併用

RDBとAOFを同時に有効化した場合、データ復旧時はAOFファイルが優先されます。AOFは通常RDBよりも詳細なデータを保持するためです。データの完全性が最も重要な場合は、AOFをメインに設定することを推奨します。

方式比較

方式 利点 欠点
RDB
  • 単一ファイルでバックアップが容易
  • 子プロセスでの処理でメインプロセスに影響なし
  • データ復旧が高速
  • スナップショット間隔でデータ損失の可能性
  • 大規模データではCPU負荷が高まる
AOF
  • 秒単位のデータ損失リスク(デフォルト設定)
  • ログ追記方式で信頼性が高い
  • 自動リライトでファイルサイズを最適化
  • RDBに比べてファイルサイズが大きい
  • fsync設定によってはパフォーマンス低下

動作メカニズム

RDBスナップショット生成プロセス:

  1. fork()で子プロセスを生成
  2. 子プロセスが一時RDBファイルにデータを書き込み
  3. 書き込み完了後、既存ファイルを原子的に置換

AOFリライトプロセス:

  1. fork()で子プロセスを生成
  2. 子プロセスが新しいログ構造を一時ファイルに作成
  3. 親プロセスは新規コマンドをメモリバッファに保持
  4. リライト完了後、バッファ内容を新ログに反映
  5. 新旧ファイルの原子的置換

設定例

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ログを介した再構築が行われます。

タグ: redis aof RDB persistence configuration

5月22日 06:45 投稿