こんにちは!Redisの奥深い世界へようこそ。
チーフアーキテクトの私だ。今日は、Redisを実務で使う上で絶対に避けて通れない、しかし正しく理解すれば怖くない「AOFファイルの肥大化と、その華麗なる解消法(`BGREWRITEAOF`)」について話をしよう。
ここをクリアすれば、君もRedisの裏側の動きが手に取るようにわかるようになる。難しい専門用語はなるべく排して、普段の生活に例えながら優しく紐解いていくから、安心してついてきてほしい。
—
1. Redisの「メモ帳」:AOFとは何か?
Redisは、超高速にデータを読み書きできる「インメモリデータベース」だ。つまり、すべてのデータをコンピューターのメインメモリ上に保持している。
しかし、メモリというのは気まぐれで、サーバーが再起動したり電源が落ちたりすると、中身がきれいさっぱり消えてしまう儚い性質を持っている。
そこで登場するのが「AOF(Append Only File)」だ。
Redisは、データが更新されるたびに、その操作内容(「AにBという値をセットした」「Cを削除した」といったコマンド)を、まるで料理のレシピをメモするように、コツコツとファイルに書き留めていく。これがAOFの正体だ。
日常で例えるなら…
君が毎日のお小遣い帳をつけているとしよう。
- 「朝、お小遣いから100円使ってジュースを買った」
- 「昼、お小遣いから500円使ってランチを食べた」
- 「夕方、お母さんから1000円もらった」
この「やったことの全記録」を時系列でノートに書き残しておくのがAOFだ。万が一、記憶喪失になっても(サーバーが落ちても)、このノートを最初から順番に読み直せば、手元にあるお金(データ)の正確な金額を完全に復元できるというわけだ。
—
2. メモ帳が抱える「致命的な問題」
さて、このメモ帳方式、非常に安全で確実なのだが、一つ大きな問題がある。
「使えば使うほど、ノートが分厚くなりすぎる」ということだ。
例えば、こんなやり取りを想像してほしい。
1. 「Aに『りんご』をセットする」
2. 「Aを『みかん』に変更する」
3. 「Aを『バナナ』に変更する」
4. 「Aを『ぶどう』に変更する」
AOFノートには、これら4つの履歴がすべて残る。しかし、最終的に私たちが知りたい「現在のAの状態」は何だろう? そう、「ぶどう」だけだ。
途中のりんご、みかん、バナナの履歴は、最終的な結果を出すためにはもう必要のない「過去の遺物」なのだ。
この不要な履歴が何百万行も積み重なると、どうなるか?
- ディスクの容量を無駄に圧迫する。
- サーバーが万が一落ちたとき、そのぶ厚いノートを最初から最後まで読み直すのにもの凄く時間がかかる(復旧に時間がかかり、サービスが止まってしまう)。
ここで先輩エンジニアの登場だ。「おいおい、過去の経緯なんてどうでもいいから、『今の最終結果だけ』をスッキリまとめ直そうぜ!」と立ち上がる。
—
3. 救世主コマンド:`BGREWRITEAOF` とは?
前置きが長くなったが、ここで今回の主役`BGREWRITEAOF`(Background Rewrite AOF)の登場だ。
このコマンドは、パンパンに膨れ上がった分厚いAOFノートを裏側(バックグラウンド)で綺麗にスッキリまとめ直してくれる魔法の呪文だ。
- BG = Background(裏側でこっそり、システムを止めずに)
- REWRITE = Rewrite(書き換える)
- AOF = AOFファイル
何をしてくれるのか?
`BGREWRITEAOF`を実行すると、Redisは今のメモリ上のデータ(「いま手元にあるお金の総額」や「最新のAの値=ぶどう」)だけをチラッと見て、「今の状態を再現するのに必要な、最短かつ最速のコマンド列」を一から書き下ろした「新品の薄くて綺麗なノート」を裏で作る。
そして、古い分厚いノートとこっそり差し替えるのだ。
これにより、ファイルサイズは劇的に小さくなり、次にサーバーが再起動したときの立ち上がりスピード(復旧時間)も爆速になる。
—
4. 実際に使ってみよう
百聞は一見に如かず。実際にRedisのCLI(操作画面)で、このコマンドを叩いてみよう。
Redisに接続する
$ redis-cli
現在のAOF書き換えの状態を確認したり、手動で書き換えを指示する
127.0.0.1:6379> BGREWRITEAOF
(integer) 1
実行結果の解説:
`(integer) 1` が返ってきたら大成功。「了解!今から裏側でノートの整理整頓を始めるよ!」というRedisからの返事だ。
💡 ここがプロの知見:
この書き換え作業は「バックグラウンド」で行われるため、整理整頓の最中であっても、ユーザーからのデータの読み書き(リクエスト)を一切ブロックしない。サービスを止めることなく安全に実行できるのが、Redisの素晴らしいところだ。
現在の書き換えがどうなっているか気になる場合は、以下のコマンドで進捗を確認できる。
127.0.0.1:6379> INFO persistence
実行すると、AOFに関する詳細なステータスが表示される
aof_rewrite_in_progress:0 (0なら現在は整理完了している状態)
—
まとめ
ここまで理解できれば、Redisの永続化の基本はバッチリマスターできたも同然だ!
- AOFとは:データの変更履歴を記録する「メモ帳」。
- 抱える問題:使えば使うほどノートが分厚くなり、復旧に時間がかかる。
- `BGREWRITEAOF`の役割:今のメモリの状態から「最短のコマンド」だけを逆算し、ノートを新品にスリム化する(しかも裏側で安全に)。
実務では、設定ファイル(`redis.conf`)で自動的にこの書き換えを行う条件(例:「前回のサイズから100%増えたら実行」など)を設定しておくのが一般的だが、緊急時やメンテナンス時に手動で `BGREWRITEAOF` を叩く場面は多々ある。
仕組みの本質を知っていれば、エラーが出てももう慌てる必要はない。
さあ、自信を持って次のステップへ進もう!
コメント