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とは?
AOF Rewriteは既存の appendonly.aof
ファイルを 最適化された新しいファイルに置き換えるプロセス です。既存のAOFファイルをそのまま維持しながら新しいファイルを生成し、不必要なコマンドを削除してサイズを縮小します。この説明で重要な部分は 最適化した後に既存ファイルを置き換える という表現です。この表現がrewriteの動作方式を要約する核心です。
📌 AOF Rewriteの動作方式
- Redisは 既存のAOFファイルを直接修正することなく、新しいAOFファイルを生成します。
- 新しいファイルには 最新状態のみを反映する最小限の命令 が含まれます。
- たとえば、既存の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-percentage
とauto-aof-rewrite-min-size
を適切に設定すれば自動でAOF Rewriteが実行され、 パフォーマンスとストレージスペースを効率的に管理 できます。- RDBスナップショットと併用すると、 Redisの耐久性とパフォーマンスを同時に最適化 できます。
📌 Redisを運用する際にはAOF Rewriteを適切に活用してパフォーマンスを最適化しましょう! 🚀
右側の検索窓でredisを検索すれば、redis設定に関するより多くの記事を確認できます。
RDB
と AOF
の概念整理が必要なら、次の記事も見ることをお勧めします。
Add a New Comment