レプリケーション — 同じデータを複数台に持つ

サーバは壊れる。ならば、大事なデータを1台にだけ置いてはいけない — 同じデータの複製(レプリカ)を複数台に持たせる仕組みがレプリケーションです。ただし複製が伝わるには時間がかかり、その遅れは読む人に「古い値」として見えてしまう。複製の流れ・返事のタイミング・ずれ・そして故障時の引き継ぎまで、4つのアニメで体感します。

1. 書き込みはプライマリへ、複製はレプリカへ

もっとも広く使われる構成がプライマリ・レプリカ型(リーダー・フォロワー型とも呼ぶ)。書き込みは1台のプライマリだけが受け付け、変更内容をほかのレプリカに流します。読み取りはどのサーバからでもできます。

スライダーで複製の伝送遅延を変えて、レプリカの値がプライマリより遅れて更新される様子を見てください。

書き込みが複製されて広がる — プライマリ・レプリカ構成
クライアントの書き込み(x=n)はまずプライマリに届き(水色)、そこから各レプリカへ複製が飛びます(オレンジ)。回線の遅いレプリカ2は遅れが大きい。「遅れ ◯ 件」の表示に注目してください。
POINT — 複製する3つの理由 ①プライマリが壊れてもデータが残る(可用性) ②読み取りをレプリカに分散できる(性能) ③利用者に近い場所にデータを置ける(地理的な近さ)。1つの仕組みで3つの得がある。

2. いつ「書けました」と返事するか — 同期複製と非同期複製

プライマリがクライアントに ACK(=書けました)を返すタイミングには、2つの流儀があります。同期複製はレプリカへの複製完了を待ってから返す。非同期複製はプライマリに書けた時点ですぐ返す。

同期 vs 非同期 — ACK のタイミングを見比べる
時間は上から下へ流れます(シーケンス図)。同期(左)はレプリカの返事を待つので ACK が遅いが、ACK の時点でレプリカにもデータがある。非同期(右)は ACK が速いが、ACK 後もしばらくレプリカは古いまま(赤い帯)。
遅延同期 ≈ RTTクライアント↔プライマリ + RTTプライマリ↔レプリカ / 遅延非同期 ≈ RTTクライアント↔プライマリ 同期は一番遅いレプリカに引きずられる。台数を増やすほど・遠くに置くほど書き込みは遅くなる
注意 — 非同期の ACK は「約束」ではない 非同期複製では、ACK が返った直後にプライマリが壊れると、その書き込みは複製が間に合わず失われることがある(§4で実際に起こす)。「レプリカがあるから安全」と言い切れるのは、複製の完了を確認した書き込みだけ。

3. 複製ラグ — 書いた直後に読むと古い

非同期複製では、プライマリとレプリカの間に複製ラグ(遅れ)が常にあります。書き込んだ直後にレプリカから読むと、さっき書いたはずの値が「まだない」 — SNS で自分の投稿が一瞬表示されない、あの現象の正体です。

実際にやってみましょう。「書き込む」を押した直後に「レプリカから読む」を押すと…

複製ラグを体感する — どこから読むかで答えが変わる
書き込みはプライマリに入り、設定したラグの後にレプリカへ届きます。ラグの間にレプリカから読むと古い値(赤)が返り、プライマリから読めば常に最新(緑)。右のログに読み取り結果が並びます。
一歩先へ — ずれを利用者に見せない工夫 「自分が書いたものは自分には最新で見せる」(read-your-writes)を保証するため、実際のサービスは工夫を重ねている。書き込み直後の読み取りだけプライマリへ送る、利用者ごとに読むレプリカを固定する、書き込み時刻を覚えておいてそれ以上に新しいレプリカだけから読む、など。詳しくは「一貫性モデル」のレッスンで。

4. プライマリが倒れたら — フェイルオーバー

プライマリが故障したら、レプリカの1台を新しいプライマリに昇格させて書き込みを引き継ぎます。これがフェイルオーバー。ただし非同期複製では、まだ複製されていなかった「ACK 済みの書き込み」が新プライマリに存在せず、失われることがあります。

非同期モードでプライマリを停止して、失われる書き込みを実際に見てください。同期モードに切り替えれば失われないことも確かめられます。

フェイルオーバー — 昇格と、失われる書き込み
クライアントは1.3秒ごとに自動で書き込み、「ACK済み: Wn」が確認の取れた番号です。プライマリを停止すると、いちばん進んでいるレプリカが昇格して書き込みが再開します。非同期では「ACK 済みなのに新プライマリに届いていない」書き込みが失われます(赤い表示)。同期なら失われません。
失われ得る書き込み ≈ 書き込みレート × 複製ラグ 非同期複製でプライマリが落ちた瞬間、ラグの間に ACK した書き込みが宙に浮く

5. まとめ — 複製は「遅れ」とセットで考える

POINT — 「速さ」と「安全」のダイヤル 同期か非同期かは、どちらかが正解という話ではなく、失ってよいものと待てる時間のトレードオフ。実システムでは「1台だけ同期・残りは非同期」(半同期)や、この後のレッスンで学ぶクォーラムのような中間解がよく使われる。