【実務・中級編】 AOF (Append Only File) – Redis

Redis AOFの深淵:なぜ「ただのログ」が最強の永続化戦略なのか

エンジニア諸君。Redisを「単なる高速なキャッシュ」と呼ぶのは、フェラーリを近所のコンビニの買い物に使うようなものだ。

Redisの真価は、そのメモリ内データ構造と、それをいかに「堅牢に」永続化できるかというトレードオフの設計にある。今回は、RDB(スナップショット)という安易な妥協を捨て、AOF (Append Only File) という永続化の真髄について、現場で血を流してきたアーキテクトの視点から説く。

—

1. AOFの本質:バイナリログによる「再現性」の担保

AOFは、Redisが受信した全ての書き込みコマンドを、Redisプロトコル形式でログファイルに追記する仕組みだ。RDBが「ある時点のメモリのスナップショット」を保存するのに対し、AOFは「変更の履歴」を保存する。

これがなぜ重要か? それは、「不整合の最小化」に他ならない。

なぜRDBでは足りないのか

RDBはバイナリ形式のダンプであり、一定間隔での保存しかできない。つまり、前回の保存からクラッシュまでの間に発生したデータは、無慈悲にも消失する。一方でAOFは、設定次第で「コマンド単位の永続化」が可能だ。データの一貫性を何よりも優先するシステムにおいて、AOFは不可欠な選択肢となる。

—

2. 実務で必須の「fsync」戦略:パフォーマンスとの死闘

AOFを使う上で、避けては通れないのが `appendfsync` の設定だ。ここを理解せずに運用するのは、時限爆弾を抱えて寝るのと同義だ。

| 設定値 | 特徴 | 評価 |
| :— | :— | :— |
| `always` | コマンド毎にディスク書き込み。最も安全だが遅い。 | 実務では非推奨(I/Oボトルネック必至) |
| `everysec` | 1秒ごとにディスク同期。デフォルト。 | 実務の最適解 |
| `no` | OSに任せる。最速だがリスク大。 | 採用すべき場面はほぼない |

アーキテクトの知見:
`everysec` は、Redisのパフォーマンスとデータの安全性(最大1秒のロスを許容)の黄金比だ。もしあなたがこれを「遅い」と感じるなら、それはRedisの設定の問題ではなく、ストレージのI/O性能がボトルネックになっている。SSDの選定、あるいは物理配置を見直すべきだ。

—

3. AOF Rewrite:肥大化するログへの処方箋

AOFを使い続けると、ログファイルは際限なく肥大化する。再起動時のリカバリに数時間かかるようでは、システムとして失格だ。ここで登場するのが AOF Rewrite である。

Redisは、現在のメモリ状態を表現する「最小限のコマンドセット」を再構築し、新しいログファイルに書き出す。

  • `INCR counter` を100回繰り返したログも、Rewrite後は `SET counter 100` に最適化される。

実務でのチューニングポイント

自動Rewriteのトリガー設定
ファイルサイズが前回の2倍かつ64MBを超えたら実行
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

この値を厳密に設定せよ。メモリサイズが数GB規模になるなら、`auto-aof-rewrite-min-size` を数GB単位に引き上げるのが定石だ。頻繁なRewriteはCPU負荷を増大させ、レイテンシスパイクを引き起こすからだ。

—

4. 堅牢な設計パターン:AOFとどう付き合うか

実務で私が設計する際は、以下の原則を厳守している。

1. RDBとの併用(Hybrid Persistence):
Redis 4.0以降は、AOFとRDBを組み合わせたハイブリッド永続化が可能だ。AOFの末尾にRDBのダンプを付与することで、再起動時の読み込みを爆速にする。これを必ず有効にせよ。

aof-use-rdb-preamble yes

2. ディスクI/Oの分離:
AOFファイルは、OSのログやアプリケーションデータとは別の物理ディスクに配置せよ。Redisはシングルスレッドで動作するため、fsync待ちが発生すると全リクエストがブロックされる。I/O競合を避けるのが、スケーラビリティの第一歩だ。

3. 監視の徹底:
AOFの書き込みエラーは、往々にしてディスク容量不足に起因する。`aof_last_write_status` を監視し、`error` になった瞬間に通知を飛ばす仕組みがなければ、真のエンジニアとは言えない。

—

最後に:完璧なシステムなど存在しない

AOFは強力だが、魔法ではない。どれだけ最適化しても、OSやハードウェアレベルの障害から100%データを保護するものではない。

真に堅牢なシステムを構築したいなら、「Redisの永続化はデータの信頼性を高める一つの層」と考え、必要に応じてアプリケーション層での二重書き込みや、レプリケーションを用いた高可用性構成(SentinelやCluster)を組み合わせる。

Redisを使いこなすとは、こうした「制約」を深く理解し、その上で最善のアーキテクチャを描くことだ。諸君のプロジェクトで、この知見が役に立つことを期待している。

次は、Redis Clusterのシャーディング戦略について語るとしようか。では、コーディングに戻れ。

コメント

タイトルとURLをコピーしました