【れぷりけーしょん】

レプリケーション(データベース) とは?

💡 データベースの「分身」を作って負荷分散と可用性を確保
📌 このページのポイント
データベースレプリケーション アプリ クライアント 書込 読取 Primary 書込み専用(マスター) データの正本 複製(同期) Replica 1 読取り専用 Replica 2 読取り専用 Replica 3 読取り専用 書込みはPrimary、読取りはReplicaに分散して負荷を軽減
データベースレプリケーションのイメージ
ひよこ ひよこ

なんで複製が必要なの?

ペンギン先生 ペンギン先生

理由は2つ。①可用性:マスターDBが故障しても、レプリカに切り替えてサービスを継続できる。②パフォーマンス:読み取りクエリをレプリカに分散して、マスターの負荷を減らせる。Webアプリは読み取りが書き込みの10〜100倍多いから、レプリカへの分散効果は大きいよ

ひよこ ひよこ

同期と非同期の違いは?

ペンギン先生 ペンギン先生

同期レプリケーションは書き込みがレプリカにも反映されたことを確認してから完了とする。データの一貫性は保証されるけど遅い。非同期レプリケーションは書き込みを即座に完了して、レプリカへの反映は後追い。高速だけどレプリカが少し遅れる(レプリケーションラグ)。多くのシステムは非同期を採用しているよ

ひよこ ひよこ

レプリケーションラグって問題?

ペンギン先生 ペンギン先生

同期レプリケーションでは、書き込み直後にレプリカを読むと古いデータが返ることがあるよ。「プロフィールを更新したのにリロードしたら古い情報が表示される」みたいな現象。対策として、①書き込み直後はマスターを読む、②Read-Your-Writes一貫性を実装する、③レプリケーションラグを監視するなどがあるね

ひよこ ひよこ

フェイルオーバーの注意点は?

ペンギン先生 ペンギン先生

①スプリットブレイン(旧マスターと新マスターの両方が書き込みを受ける)を防ぐ仕組みが必要、②非同期レプリケーションの場合、レプリカ昇格時に未反映のデータが失われる可能性がある、③アプリの接続先変更を自動化する(ProxySQLやPgBouncerを使う)。AWSのRDSならMulti-AZ構成で自動フェイルオーバーが提供されるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「レプリケーション」って出てきたら「DBの複製を作って可用性と性能を上げる技術」と思えればだいたいOK!
📖 おまけ:英語の意味
「Database Replication」 = データベースの複製
💬 Replication(複製)。マスターの変更をリアルタイムにレプリカにコピーするよ
← 用語集にもどる