こんにちは!今日も一緒に技術の深掘りをしていきましょう。あなたの頼れる先輩エンジニアです。
インメモリデータベースの代表格である Redis(レディス) は、その圧倒的な速さから多くのシステムで採用されています。実務で使うようになると必ず出会うのが、データを安全に保持したり読み込み処理を分散したりする「レプリケーション(複製)」という仕組みです。
そして、レプリケーションを運用する上で絶対に避けて通れないのが「通信トラブル」です。
インターネットの世界では、ほんの一瞬だけネットワークが途切れることは日常茶飯事です。そのときRedisの裏側で何が起きているのか? どうやって素早く元の安全な状態に戻るのか?
今回は、Redisが誇る賢いリカバリー機能「部分再同期(Partial Resynchronization)」と、その運命を握る`repl-backlog-size`という設定について、日常の出来事に例えながら世界一わかりやすく解説しますね。
ここをクリアすれば、Redisの基本と運用のコツはバッチリマスターできますよ!
—
1. そもそも「レプリケーション」ってなんだっけ?
解説に入る前に、イメージを揃えておきましょう。
Redisのレプリケーションは、「メインで働く親機(マスター)」のデータを、「控えの小僧である子機(レプリカ)」にリアルタイムでコピーし続ける仕組みです。
これを日常のシチュエーションに例えてみましょう。
- マスター(親機): 現場でどんどん指示を出す「熱血ベテラン上司」
- レプリカ(子機): 上司の発言を横でカタカタとメモ帳に書き留める「新人アシスタント」
上司が「Aさんのデータを更新!」「Bさんのデータを削除!」と言うたびに、アシスタントは自分のメモ帳に同じ内容を書き込みます。こうすることで、上司に万が一のことがあっても、アシスタントのメモを見れば続きから仕事を再開できるわけです。
—
2. 通信が切れた!昔のRedisと今のRedis
では、もし「アシスタントがトイレに行っていて、5分間上司の指示を聞き逃した」としたらどうなるでしょうか? これが「ネットワーク切断」の状態です。
戻ってきたアシスタントは、聞き逃した5分間のデータを取り戻さなければなりません。ここで同期のやり方が2種類登場します。
❌ 昔のやり方:全再同期(Full Resynchronization)
「すみません!席を外していたので、上司のこれまでの人生の全記録(全データ)を最初から全部書き写させてください!」
……これ、ものすごく大変ですよね? 上司は自分の全データをファイルに書き出すために膨大なエネルギーを使い、アシスタントもそれを全部もらうためにネットワークを圧迫します。これを専門用語で全再同期(フルシンク)と呼びます。データ量が何十ギガもある場合、システム全体が悲鳴を上げてしまいます。
⭕️ 今の賢いやり方:部分再同期(Partial Resynchronization)
「すみません!10:00から10:05までの5分間の指示だけ、もう一度教えてもらえますか?」
これなら一瞬で追いつけますよね! この「抜けていた差分だけをスマートに埋める仕組み」こそが、今回のテーマである部分再同期(Partial Resynchronization / パワーアップしたPSYNCコマンド)です。
—
3. 秘密兵器「レプリケーション・バックログ」とは?
「ちょっと待って、上司(マスター)はどうやって『5分間に何を指示したか』を覚えているの?」と思いましたよね。素晴らしい着眼点です!
上司はデスクの片隅に「直近の指示をメモしておくホワイトボード」を持っています。Redisではこれをレプリケーション・バックログ(Replication Backlog)と呼びます。
【上司のデスクのホワイトボード(レプリケーション・バックログ)】
———————————————————
[過去の指示] -> [指示101] -> [指示102] -> [指示103] -> (最新)
———————————————————
※ホワイトボードのサイズ(repl-backlog-size)には限りがある!
上司は指示を出しながら、このホワイトボードにもコソッと書き残しています。
アシスタントが戻ってきたら、こう会話します。
- アシスタント:「私、指示100番まで持ってます!続きをください!」
- 上司:「OK、ホワイトボードを見るね。あ、101番から103番が残ってるよ。この差分だけ持っていきなさい!」
これで無事に「部分再同期」が成功します!
—
4. 設定のキモ!`repl-backlog-size` が超重要な理由
ここで一番大切な設定パラメーター `repl-backlog-size` の登場です。
ホワイトボード(バックログ)の広さには限りがあります。古い指示はどんどん消され、新しい指示で上書きされていく「リングバッファ」という構造になっています。
もし、ネットワークが10分間切れていて、アシスタントが戻ってきたときに「ホワイトボードから古い指示がすでに消されていた」としたら……?
- アシスタント:「私、指示50番まで持ってます!」
- 上司:「ごめん!ホワイトボードが狭くて、今は100番以降の指示しか残ってないや……諦めて全再同期(最初から全部やり直し)しよう!」
ガーン! せっかく部分再同期の仕組みがあるのに、ホワイトボードが小さすぎたせいで、地獄の全再同期に逆戻りしてしまいました。
だからこそ、インフラエンジニアは「ネットワークが一時的に切れても、差分が消えない十分な広さのホワイトボード」を確保するために、`repl-backlog-size` を適切に設定する必要があるのです。
—
5. 実際の設定ファイルとコマンドを見てみよう!
難しく考える必要はありません。Redisの設定ファイル(`redis.conf`)に数行書くだけです。
設定例(redis.conf)
——————————————————————
レプリケーション・バックログの設定
——————————————————————
バックログ(ホワイトボード)のサイズを指定します。
デフォルトは 1mb ですが、書き込みが多い環境では大きめに確保します。
repl-backlog-size 64mb
子機(レプリカ)が1台もいなくなってから、
バックログのメモリを解放するまでの時間(秒)です。
0にすると、どれだけ時間が経ってもバックログを保持し続けます。
repl-backlog-ttl 3600
> 💡 先輩のアドバイス:
> サイズの目安は `(1秒あたりの書き込みデータ量) × (許容したい通信切断の時間秒数)` です。
> 例えば、1秒に1MBの書き込みがあり、60秒間のネットワーク瞬断に耐えたいなら `64mb` 程度積んでおくと安心ですね!
ステータスを確認してみよう(INFO replication)
Redisにログインして `INFO replication` コマンドを打つと、ホワイトボードの状態がひと目でわかります。
127.0.0.1:6379> INFO replication
Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.20,port=6379,state=online,offset=1405,lag=0
— ここからがバックログ情報 —
repl_backlog_active:1 # 1ならバックログ機能が有効
repl_backlog_size:67108864 # ホワイトボードのサイズ(64MB)
repl_backlog_first_byte_offset:1 # ホワイトボードに残っている一番古いデータの位置
repl_backlog_histlen:1405 # 今ホワイトボードに溜まっているデータのバイト数
アシスタント(レプリカ)が戻ってきた時、自分が持っている最後の位置(offset)が、この `repl_backlog_first_byte_offset` より新しければ、見事部分再同期が成功します!
—
まとめ:本日のチェックポイント
1. 部分再同期(PSYNC)は、通信が切れたときに「差分だけ」を素早く復旧させる賢い仕組み。
2. 差分を一時的に保存しておく場所をレプリケーション・バックログと呼ぶ。
3. `repl-backlog-size` が小さすぎると、差分が溢れて重たい「全再同期」になってしまう。
4. システムの書き込み量とネットワークの安定性に合わせて、バックログサイズを広めに設定しておくのがプロの技!
仕組みさえ分かってしまえば、全く怖くないでしょう?
Redisの高可用性(落ちないシステム作り)は、こうした「一瞬のトラブルへの配慮」の積み重ねで成り立っています。この感覚が掴めれば、あなたのRedis知識はもう初心者レベルを完全に脱出していますよ。
自信を持って、次のステップへ進んでいきましょう!応援しています!
コメント