こんにちは! Redisの仕組みをさらに深く知りたい君へ。
今日は、Redisのデータが消えないように守ってくれる仕組みの中から、少しだけ裏側の「職人技」みたいな部分を覗いてみようか。
テーマは「AOFリライトバッファ」。
なんだか難しそうな名前だよね。「AOF」とか「バッファ」とか、エンジニアっぽい堅苦しい言葉が並んでいるけれど、本質を掴んでしまえば「なるほど、よくできてるなぁ!」と膝を打つような面白い仕組みなんだ。
ここをクリアすれば、Redisのデータ永続化の基本はバッチリマスターできるよ。さあ、僕と一緒に紐解いていこう。
—
1. 例え話から始めよう:ノートの「清書」と「リアルタイムのメモ」
まず、Redisがデータをどうやって保存しているかのおさらいから。
Redisはメモリ上で高速に動くデータベースだけど、電源が落ちたらデータが消えちゃう。だから、行った変更(「Aさんに100円足したよ」とか)を順番にノートに書き留めていくんだ。これが AOF(Append Only File) という仕組み。
さて、このノート、変更があるたびに後ろへ後ろへと書き足していくから、放っておくとどんどん分厚くなっていく。
「Aに100円足す」「やっぱり50円引く」「また30円足す」……これ、結果だけ見れば最初から「80円足す」だけでいいよね?
そこでRedisは、定期的に「分厚くなったノートをスッキリ綺麗にまとめる(清書する)」という作業をするんだ。これを「リライト(書き直し)」と呼ぶ。
ここで、日常のこんなシーンを想像してみて。
> 君が分厚いノートの「清書」を一生懸命やっている最中に、友達がやってきて「新しい伝言!」を次々と伝えてきた。
> さあ、どうする?
1. 清書に集中して、新しい伝言を聞き逃す? ── ダメ絶対!
2. 清書をいったん中断して、伝言をメモする? ── 手が汚れて効率が悪い。
Redisはこの問題を解決するために、「清書用の一時的なメモ用紙」を用意したんだ。これこそが、今回のお題である「AOFリライトバッファ」だよ!
—
2. AOFリライトバッファの正体と動き
もう少しエンジニアっぽく、内部の動きを整理してみよう。
Redisがバックグラウンドで古いAOFファイルを綺麗にコンパクトなファイルへ清書(リライト)している最中も、世界中(クライアント)からの新しい書き込み(`SET` や `HSET` など)は容赦なくやってくる。
もし、この「清書中に入ってきた新しい書き込み」をそのまま捨てちゃったら大変だよね。データが古くなっちゃう。
だからRedisは、以下の3ステップで華麗にこれをさばいているんだ。
1. 清書のスタート:
Redisは現在のデータをコピーして、新しい綺麗なAOFファイルを作り始める(この間も古いAOFやメモリはそのまま動いている)。
2. バッファへの一時退避(ここが主役!):
清書が始まっている最中に新しい書き込みが来たら、Redisは「AOFリライトバッファ」という専用のメモリ領域に、その変更内容を一時的に溜めておく。
3. 仕上げ(追記とチェンジ):
清書が無事に終わったら、リライトバッファに溜まっていた「清書中に入った最新の変更たち」を、新しくできた綺麗なAOFファイルの最後にペタッと追記する。そして最後に、古いファイルと新しいファイルを差し替える。
これで、清書中であってもデータの取りこぼしが完璧に防げるというわけ。すごい巧妙で美しい仕組みだと思わない?
—
3. 実務で知っておきたいポイント(ちょっと一歩先へ)
この「AOFリライトバッファ」だけど、実務(プロダクション環境)では少しだけ気にかけておかなきゃいけないポイントがあるんだ。
それは何かと言うと……「メモリの消費量」。
もし、Redisに対して「ものすごい猛スピードで書き込み(大量のデータ更新)」が起きている最中に、タイミング悪くAOFリライトが始まっちゃったらどうなる?
清書が終わるまでの間、新しい書き込みがどんどん「AOFリライトバッファ」に溜まり続けるよね。
結果として、このバッファがパンパンに膨れ上がり、サーバーのメモリを圧迫してしまうリスクがあるんだ。
💡 現場の知恵
だから、大規模なシステムを運用するときは、
- メモリに十分な余裕を持たせておくこと
- 自動リライトが頻発しすぎないように、設定値(`auto-aof-rewrite-percentage` など)を適切にチューニングすること
が、シニアエンジニアの腕の見せ所だったりするんだ。
—
まとめ
- AOFリライトとは、分厚くなった操作ログのノートを綺麗に清書してスリム化する機能。
- AOFリライトバッファとは、その清書をしている最中にやってきた「新しい書き込み」を一時的にプールしておくメモ用紙。
- 清書が終わったら、バッファの内容を最後にまとめて書き足すことで、データの整合性を完璧に守っている。
仕組みを知ってみると、Redisが裏側でいかにスマートに、私たちが安心してデータを預けられるように働いてくれているかがよく分かるよね。
ここをクリアできれば、もうRedisの永続化の基本はバッチリマスターだよ!自信を持っていい。
もしまた分からないことが出てきたら、いつでも先輩に聞いてね。一緒にレベルアップしていこう!
コメント