Redisはデータをディスクに永続的に保存する方法として AOF (Append-Only File) 方式を提供しています。しかし、時間が経つにつれてAOFファイルのサイズが大きくなると、パフォーマンスの低下やディスクスペースの問題を引き起こす可能性があります。これを解決するために、Redisは AOF Rewrite (再書き込み、圧縮) 機能を提供します。今回の記事ではAOF Rewriteが何であるか、どのように動作するのか、そして設定方法について詳しく見ていきます。


1. AOF(Append-Only File)とは? なぜRewriteが必要なのか?

Redisはデータを永続的に保存するためにAOFファイルを使用し、 すべての書き込み操作を順次きざむ ことができます。たとえば、 SET key value というコマンドが実行されるたびにAOFファイルに記録されます。これにより、Redisサーバが再起動されてもデータを復元できます。

しかし、時間が経つにつれて 同じキーに対する重複したコマンド がAOFファイルに追加され続け、サイズが大きくなり、復元時間が長くなるという問題が発生します。

これを解決するために AOF Rewrite (圧縮、整理) 機能 が提供されています。


2. AOF Rewriteとは?

Redis AOF Rewrite Infographic

AOF Rewriteは既存の appendonly.aof ファイルを 最適化された新しいファイルに置き換えるプロセス です。既存のAOFファイルをそのまま維持しながら新しいファイルを生成し、不必要なコマンドを削除してサイズを縮小します。この説明で重要な部分は 最適化した後に既存ファイルを置き換える という表現です。この表現がrewriteの動作方式を要約する核心です。

📌 AOF Rewriteの動作方式

  1. Redisは 既存のAOFファイルを直接修正することなく、新しいAOFファイルを生成します。
  2. 新しいファイルには 最新状態のみを反映する最小限の命令 が含まれます。
  3. たとえば、既存のAOFファイルが次のような場合:
   SET key1 "hello"
   SET key1 "world"
   SET key1 "final"

AOF Rewrite後は次のように最適化されます:

SET key1 "final"

つまり、新しい appendonly.aof.tmp ファイルが完成すれば、既存ファイルを削除し、新しいファイルに置き換えます。(tmpファイルがaofファイルを置き換えます。)


3. AOF Rewriteの設定方法

✅ 自動AOF Rewriteの設定

RedisはAOF Rewriteを自動的に実行するように設定できます。 redis.conf で次のように設定します:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • auto-aof-rewrite-percentage 100: 最後のAOF Rewrite後、ファイルサイズが 100% (2倍) 以上増加した場合にRewriteを実行 します。
  • auto-aof-rewrite-min-size 64mb: AOFファイルが 最小64MB以上のときのみRewriteを実行 します。

つまり、既存のAOFファイルサイズが50MBで、その後100MBになるとRewriteが自動的に実行されます。

これらの2つのオプションは常に一緒に設定することをお勧めします。 auto-aof-rewrite-min-size の値を指定しないと、以前のAOFファイルサイズが20MBのときにファイルが40MBに増加する瞬間に不必要なrewriteが発生する可能性があります。したがって、 auto-aof-rewrite-min-size を設定すると、一定サイズ以上になったときのみrewriteが実行されることが保証されます。

つまり、既存のAOFファイルサイズが50MBで、その後100MBになるとRewriteが自動的に実行されます。

✅ 手動でAOF Rewriteを実行

以下のコマンドを実行すると、Redisが即座にAOF Rewriteを実行します。

redis-cli BGREWRITEAOF

このコマンドを実行すると、Redisは バックグラウンドで新しいAOFファイルを生成 し、既存ファイルとの置き換えが自動的に行われます。


4. AOF Rewriteの結果物

AOF Rewriteが実行されると、Redisのデータディレクトリ(/var/lib/redis など)に次のようなファイルが生成されます。

ls /var/lib/redis

出力例:

appendonly.aof
appendonly.aof.tmp  # rewrite中に生成された一時ファイル
  • appendonly.aof.tmp: AOF Rewrite中に生成された新しい最適化されたAOFファイル。
  • appendonly.aof: Rewrite完了後、既存ファイルが削除され、新しいファイルに置き換わります。

🚨 AOF Rewriteは既存のAOFファイルを圧縮するのではなく、新しいAOFファイルを生成して既存ファイルを置き換える方式です。


5. AOF Rewriteをいつ活用すればよいか?

AOFファイルサイズが大きすぎてディスクスペースを大量に占めている場合 - Redisは持続的にデータを記録するため、時間が経つにつれてファイルサイズが増加します。 - 不必要な命令を整理して ディスク使用量を削減できます。

Redisの再起動時に復元速度を速くしたい場合 - AOFファイルサイズが大きいと、Redisが再起動される際に すべての命令を実行してデータを復元 する必要があり、時間がかかります。 - AOF Rewriteを実行すると、ファイルサイズが縮小され、 復元速度が速くなります。

Redisのパフォーマンスを最適化したい場合 - AOFファイルが大きくなりすぎるとRedisのパフォーマンスが低下する可能性があります。 - 定期的にAOF Rewriteを実行すると、 Redisがより安定的に運用 されます。


6. RDBスナップショットとAOF Rewriteの違い

比較項目 AOF (Append-Only File) RDB (Redis Database)
保存方法 すべての書き込み操作を記録 一定間隔ごとに全データをダンプ
復元速度 遅い (すべての命令を実行する必要あり) 速い (バイナリダンプ復元)
データ損失の可能性 少ない (fsyncの設定に依存) ある (スナップショットの周期に依存)
ファイルサイズ 大きい (すべての操作が記録される) 小さい (最新状態のみ保存)
パフォーマンスへの影響 高い (すべての操作がログに記録される) 低い (定期的にダンプを実行)
適した用途 高い耐久性が必要な場合 迅速な復元が必要な場合

👉 Redisの運用環境ではAOF + RDBを一緒に設定して最適なパフォーマンスと安定性を確保することが一般的です。


7. 結論と要約

  • Redisの AOF RewriteはAOFファイルサイズを縮小し、復元速度を改善するために実行 されます。
  • 既存のAOFファイルを直接修正するのではなく、 新しい最適化されたAOFファイルを生成して既存ファイルを置き換える方式 に動作します。
  • auto-aof-rewrite-percentageauto-aof-rewrite-min-size を適切に設定すれば自動でAOF Rewriteが実行され、 パフォーマンスとストレージスペースを効率的に管理 できます。
  • RDBスナップショットと併用すると、 Redisの耐久性とパフォーマンスを同時に最適化 できます。

📌 Redisを運用する際にはAOF Rewriteを適切に活用してパフォーマンスを最適化しましょう! 🚀

右側の検索窓でredisを検索すれば、redis設定に関するより多くの記事を確認できます。

RDBAOF の概念整理が必要なら、次の記事も見ることをお勧めします。

Redis 第2編:Redisのデータ保護オプション - RDB vs AOF