Redisは強力なインメモリデータストレージです。高速性が生命線ですが、「インメモリ」という特性上、サーバーが再起動するとすべてのデータが消えるリスクがあります。それを防ぐためにRedisは2つの永続性オプションを提供しています。

  1. RDB (スナップショット): 特定の時点のデータ全体をスナップショットとしてディスクに保存します。

  2. AOF (Append Only File): すべての書き込み命令をログファイルに順次記録します。

AOFはRDBに比べてデータ損失のリスクがほとんどなく(通常1秒以内)、強力な耐久性を保証します。しかし、すべての書き込み操作をファイルに記録することは明白な性能コストを引き起こします。

「果たしてすべてのRedisの使用ケースにAOFが必要か?」

結論から言えば、「いいえ、全く必要ありません。」

今日はAOFの設定をわざわざ使用しなくても良い場合と、逆にAOFが必須な場合を明確に区別してみます。


AOFをわざわざ使用しなくても良い場合



AOFの核心的価値はデータの耐久性にあります。もしこの耐久性が重要でないデータであれば、AOFは不必要な性能低下を引き起こす「足かせ」となることがあります。

1. キャッシュとしてのみ使用する場合

最も代表的な例です。

  • 理由: キャッシュのデータは「原本」ではありません。データベース(DB)や他のAPIのような「真実の源」が別に存在します。

  • データ損失時: Redisが再起動されてキャッシュがすべてクリアされても、アプリケーションはしばらく遅くなるだけ(キャッシュミス)、原本データを再読込みしてキャッシュを充填すれば(キャッシュウォームアップ)大丈夫です。データが永遠に失われるわけではありません。

  • 結論: キャッシュ目的ならAOFはもちろんRDBすらオフにすることが多いです。ディスクI/Oを完全になくしてRedisの純粋なインメモリ速度を最大化するのが得策です。

2. Celeryブローカー/結果バックエンド(重要度の低い作業)

RedisはCeleryとよく一緒に使用されます。Celeryのブローカーと結果バックエンドとしてのRedisにおけるAOF設定では、「作業の重要度」という前提が付いています。

  • 理由: もしCeleryで処理される作業が「失敗しても構わない」または「簡単に再試行できる」場合、AOFは不必要です。

  • 例:

    • ユーザーログ分析(数秒間のログが失われても大した問題ではない)

    • 定期的なデータ整理(次の周期で再実行すればよい)

    • サムネイル画像生成(原本画像があるので再生成可能)

  • 結論: このようなシナリオではRedisサーバーがダウンするとキューにあった作業や結果が消えることがあります。しかし、この損失をビジネス的に「甘受」できるなら、AOFをオフにしてブローカーの性能を確保するのが賢明な選択です。

3. 単純な統計とリアルタイムデータ(揮発性)

短期間のトレンドを見たり、すぐに更新されるデータを扱うときです。

  • 理由: データが非常に短い周期で更新される、または特定の時点のスナップショットに大きな意味がない場合です。

  • 例:

    • 最近1分間のウェブサイト訪問者数

    • リアルタイムゲームランキング(秒単位で変動)

    • 一時セッションデータ(数分内で期限切れ)

  • 結論: どうせすぐに消えたり更新されるデータです。数秒間のデータを失うより、多くの書き込み要求を迅速に処理する性能の方が重要です。AOFはこのような環境には適していません。


Redis AOFの性能と耐久性トレードオフを示す天秤のダイアグラム

AOF使用を強く推奨する場合

反対に、Redisのデータが失われると深刻な問題が発生する場合、AOFは選択肢ではなく必須です。

1. '信頼できる' メッセージキュー(重要なCelery作業)

上記のCeleryの例とは真逆です。

  • 理由: 作業(タスク)自体が金銭や核心ビジネスロジックに結びついている場合です。

  • 例:

    • 決済処理要求

    • 会員登録完了および認証メール送信

    • 注文処理

  • 結論: ユーザーが「決済」ボタンを押したのに、Redisが再起動してその作業要求が消えたら深刻な障害です。このようなシナリオではfsync everysec(デフォルト)オプションでAOFを有効にし、作業がキューに入ると即座にディスクに記録されることを保証する必要があります。

2. Redisを基本データベースとして使用する場合

Redisを単なるキャッシュではなく、データの原本として使用する場合です。

  • 理由: データベースが別に存在せず、Redis自体が原本データを保存しているため、データ損失はすなわち永続的な損失を意味します。

  • 例:

    • ユーザープロフィール情報

    • 永続的に保管すべきユーザーセッション

    • ゲームの通貨(ゴールド、アイテム)情報

  • 結論: この場合AOFは必須であり、RDBスナップショットとともに使用してバックアップおよび復旧戦略を構築する必要があります。

3. トランザクションおよび集計データ

データの一貫性と正確性が非常に重要な場合です。

  • 理由: RDBは「特定の時点」を保存するため、最後のスナップショット以降のデータはすべて失われます。AOFは「すべての変更履歴」を保存するため、データ損失を最小限(最大1秒)に抑えることができます。

  • 例:

    • フォロー/アンフォロー関係

    • 正確な投票数集計

    • 金融関連データ(簡単な入出金履歴)

  • 結論: データの最終一貫性が重要な場合、AOFの「Append-Only」特性はRDBよりもはるかに適しています。


結論: 耐久性と性能のトレードオフ



AOFはRedisに耐久性を提供する強力な機能です。しかし、この機能は性能を代償として伴います。

AOFをオンにするかどうか悩んでいるなら、開発者は以下の質問に答えてみてください。

「もし今、Redisサーバーが予告なしにダウンしたら、最近数分(RDB)または1秒(AOF)間のデータが消えたとき、私たちのサービスに深刻な問題が発生するか?」

  • 「いいえ、再計算(キャッシュ)すればいいです。」 -> AOFをオフにしてください。

  • 「はい、決済履歴が消えます。」 -> AOFは必ずオンにしてください。

すべての技術的決定と同様に、正解はありません。私のサービスのデータ特性と要件を正確に把握し、適切なトレードオフを選択することが重要です。