【入門編】 BGREWRITEAOFコマンド – Redis

こんにちは!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` を叩く場面は多々ある。

仕組みの本質を知っていれば、エラーが出てももう慌てる必要はない。
さあ、自信を持って次のステップへ進もう!

コメント

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