【入門編】 完全再同期 (Full Resynchronization) – Redis

みなさん、こんにちは!Redisの世界へようこそ。

今日は、Redisを支える重要機能「レプリケーション(データの自動コピー)」の中でも、最もダイナミックな仕組みである「完全再同期(Full Resynchronization)」についてお話しします。

「レプリケーションとか再同期とか、難しそうな漢字ばかり…」と身構えなくても大丈夫ですよ。
本質さえ掴めば、実はとってもシンプルで愛着のわく仕組みなんです。ここをクリアすれば、Redisの基本はバッチリマスターできますよ。

それでは、一緒にRedisの裏側を覗いてみましょう!

—

1. 完全再同期ってなに?日常の例えで理解しよう

まずイメージしてほしいのは、「老舗のラーメン店」です。

  • マスター(親分): 本店の店長。常に新しい注文を受け、最新の秘伝レシピを更新しています。
  • レプリカ(子分): 支店の店長。本店のレシピをそのまま真似して、同じ味をお客さんに提供します。

ある日、支店(レプリカ)が新しくオープンすることになりました。
支店の店長は、本店の秘伝レシピを何ひとつ知りませんよね。

このとき、どうするでしょうか?
そうです。本店の店長から「レシピ帳を最初から最後まですべて丸写しさせてもらう」はずです。

この「ゼロからすべてのデータを丸ごとコピーして、完全に同じ状態にする作業」こそが、Redisの「完全再同期(Full Resynchronization)」です!

データの一部だけをササッと更新する「部分再同期」とは違い、完全再同期は「全データの引き継ぎ」という一大イベントなのです。

—

2. 合言葉は「PSYNC」!完全再同期が始まるまでの会話

では、Redisのサーバー同士は、どのようにして「完全再同期を始めよう!」と決めているのでしょうか?
実は、レプリカからマスターへ送る`PSYNC`(ピーシンク)というコマンドがすべての鍵を握っています。

実際の会話を覗いてみましょう。

【レプリカ】「店長!僕、今日から入った新人(または記憶喪失)です!
どこまでレシピを知っているか分からないので、全部教えてください!」
(送信コマンド: PSYNC ? -1)

【マスター】「よし分かった!じゃあ今から全データをまるごと送るぞ!
ちなみに俺のIDは『abc1234…』で、今の最新ページは『10000』だ!」
(返答: +FULLRESYNC abc1234… 10000)

ここがポイント!

  • `PSYNC ? -1` の `?` は「マスターのIDを知りません」、`-1` は「どこまで同期したか覚えていません」という意味です。
  • これを受けたマスターが「OK、じゃあ完全再同期(+FULLRESYNC)でいこう!」と判断します。

—

3. 完全再同期の4つのステップ

完全再同期が決まると、マスターとレプリカの間で以下の4つのステップが実行されます。
ここが一番面白いところですよ!

[マスター (本店)] [レプリカ (支店)]
| |
| (1) パシャッとスナップショット保存 (RDB作成) |
| ※この間の新しい注文はメモ帳に蓄える |
| |
| ————– (2) RDBファイルを送信 ———-> | (データ受け取り)
| |
| | (3) 古いデータを捨てて
| | RDBを読み込み!
| |
| — (4) メモ帳に溜まった最新の注文をまとめて送信 –> | (完全に追いつく!)

それぞれのステップをもう少し詳しく解説しますね。

ステップ1:マスターが「アルバム(RDB)」を作る

マスターは、その瞬間のデータ全件をキュッと固めたバックアップファイル(RDBスナップショット)をディスクに保存します。
※最新のRedisでは、ディスクを使わずに直接ネットワークで送る「ディスクレス機能」もあります!

ステップ2:アルバムをレプリカへ送る

出来上がった大きなRDBファイルを、ネットワークを通じてレプリカへ送信します。

ステップ3:レプリカがアルバムを読み込む

レプリカは、自分が今持っている古いデータをすべて綺麗さっぱり捨てて、届いたRDBファイルを自分のメモリに読み込みます。これで、過去の全データが復元されます。

ステップ4:追いつき作業(レプリケーションバッファの適用)

ステップ1〜3を行っている間も、本店(マスター)にはどんどん新しい注文(書き込み)が届いていますよね?
マスターは、その間に届いた新しい命令を「メモ帳(バッファ)」に大切に取っておきました。
アルバムの読み込みが終わったレプリカに、このメモ帳の内容を後から送って適用することで、ついにレプリカがマスターと寸分狂わない最新状態に追いつきます!

—

4. 実際のログを見てみよう!

実際のRedisのログ(ログファイル)には、この感動的なドラマがこのように記録されています。

— レプリカ側のログ例 —

1. マスターに接続し、同期をリクエスト
[Replica] Connecting to MASTER 127.0.0.1:6379
[Replica] Master replied to PING, ready to start with replication
[Replica] Sending PSYNC to connect to master…

2. マスターから「完全再同期するよ!」と返事が来る
[Replica] Master command containing PSYNC: +FULLRESYNC 8f3a… 0

3. マスターから全データ(RDB)を受け取って読み込む
[Replica] Receiving 102400 bytes of payload data from master
[Replica] MASTER <-> REPLICA sync: Flush old data
[Replica] MASTER <-> REPLICA sync: Loading DB in memory

4. 同期完了!これで準備バッチリ
[Replica] MASTER <-> REPLICA sync: Finished with success

専門用語が並んでいるように見えても、先ほどの「ラーメン店の例え」を知っていれば、「あ、今マスターから全データが届いたんだな」「今古いデータを消して読み込んでるな」と、ログの意味が手に取るように分かりますよね!

—

まとめ:これであなたもRedisマスターの一歩目!

完全再同期(Full Resynchronization)の流れをまとめましょう。

1. レプリカが「PSYNC ? -1」と問いかける(完全再同期の要求)
2. マスターが全データの写真(RDB)を撮影する
3. RDBをレプリカに送り、レプリカはそれを読み込む
4. 転送中に増えた最新データも追っかけで送って、同期完了!

完全再同期は、Redisが「絶対にデータを間違えず、安全に複製を作る」ために欠かせない、とても賢く頼もしい仕組みです。

一歩ずつ仕組みを理解していけば、Redisは決して怖いものではありません。ここをクリアできたら、レプリケーションの基本はバッチリマスターですよ!

次回は「じゃあ、ちょっとだけ回線が切れた時はどうするの?」というテーマで、「部分再同期(Partial Resynchronization)」についてお話ししようと思います。楽しみにしていてくださいね。

お疲れ様でした!応援しています!

コメント

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