581 文字
3 分
レプリケーションは「同じものを増やす」
レプリケーションは、データベースの内容を別のサーバーに 複製 して持つ仕組みです。可用性(片方が落ちても止まらない)と、読み取り性能(読みを分散できる)の両方に効きます。
シャーディングとの違い
似た文脈でよく語られる「シャーディング」と並べると役割が分かりやすいです。
- シャーディング:データを 分けて 複数台に持つ。容量・書き込みスループットのスケール。
- レプリケーション:データを 増やして 複数台に持つ。可用性・読み取りスループットの強化。
両方を組み合わせて使うことも多いです(シャードごとにレプリカを持つ、など)。
代表的な構成
シングルマスター・マルチスレーブ
- 書き込みはマスター1台、読み取りはレプリカ複数台へ。
- 一番素直な構成で、MySQL の標準。
- ただし、レプリカは少し遅れる(レプリカラグ)ことを前提に設計する必要がある。
マルチマスター
- 複数台で書き込み可能。
- 書き込み衝突の解決が難しく、運用が一気に重くなる。
- 地理分散したシステムなど、特別な要件があるときに採用する。
同期と非同期
- 同期レプリケーション:マスターはレプリカが書き込みを受け取って初めて、クライアントに「成功」を返す。安全だが遅い。
- 非同期レプリケーション:マスターは自分のWALに書いた時点で成功扱い。速いが、マスターが突然死ぬとレプリカに反映されていなかった分は失われる。
- 準同期:1台でもレプリカが追いついたら成功とみなす、中間方式。
「どれだけのデータロスを許容できるか」(RPO)と「障害時にどれだけ早く復旧できるか」(RTO)に応じて選びます。
読み取り分散のときの落とし穴
「書いた直後に読む」処理で、レプリカに反映が間に合わずに古いデータが返るケースがあります。
- 書き込み直後の数秒間だけマスターから読む。
- セッション内ではマスター固定で読む。
- 「自分のセッション内ではリードアフターライトを保証する」アプリ側の工夫が必要になる。
レプリケーションは「黙って増やしただけ」では恩恵を得にくく、書き込みと読み取りの動線まで含めて設計する仕掛けです。