581 文字
3 分
レプリケーションは「同じものを増やす」

レプリケーションは、データベースの内容を別のサーバーに 複製 して持つ仕組みです。可用性(片方が落ちても止まらない)と、読み取り性能(読みを分散できる)の両方に効きます。

シャーディングとの違い#

似た文脈でよく語られる「シャーディング」と並べると役割が分かりやすいです。

  • シャーディング:データを 分けて 複数台に持つ。容量・書き込みスループットのスケール。
  • レプリケーション:データを 増やして 複数台に持つ。可用性・読み取りスループットの強化。

両方を組み合わせて使うことも多いです(シャードごとにレプリカを持つ、など)。

代表的な構成#

シングルマスター・マルチスレーブ#

  • 書き込みはマスター1台、読み取りはレプリカ複数台へ。
  • 一番素直な構成で、MySQL の標準。
  • ただし、レプリカは少し遅れる(レプリカラグ)ことを前提に設計する必要がある。

マルチマスター#

  • 複数台で書き込み可能。
  • 書き込み衝突の解決が難しく、運用が一気に重くなる。
  • 地理分散したシステムなど、特別な要件があるときに採用する。

同期と非同期#

  • 同期レプリケーション:マスターはレプリカが書き込みを受け取って初めて、クライアントに「成功」を返す。安全だが遅い。
  • 非同期レプリケーション:マスターは自分のWALに書いた時点で成功扱い。速いが、マスターが突然死ぬとレプリカに反映されていなかった分は失われる。
  • 準同期:1台でもレプリカが追いついたら成功とみなす、中間方式。

「どれだけのデータロスを許容できるか」(RPO)と「障害時にどれだけ早く復旧できるか」(RTO)に応じて選びます。

読み取り分散のときの落とし穴#

「書いた直後に読む」処理で、レプリカに反映が間に合わずに古いデータが返るケースがあります。

  • 書き込み直後の数秒間だけマスターから読む。
  • セッション内ではマスター固定で読む。
  • 「自分のセッション内ではリードアフターライトを保証する」アプリ側の工夫が必要になる。

レプリケーションは「黙って増やしただけ」では恩恵を得にくく、書き込みと読み取りの動線まで含めて設計する仕掛けです。