レプリケーション

データベースの複製と高可用性

レプリケーションの目的

高可用性

障害時にレプリカに切り替えてサービス継続

負荷分散

読み取りクエリをレプリカに分散

災害対策

地理的に離れた場所にデータを保持

同期 vs 非同期

項目同期レプリケーション非同期レプリケーション
データ整合性強い(データロスなし)弱い(遅延あり)
パフォーマンス遅い(レプリカ待ち)速い
ネットワーク障害時書き込み停止継続可能
ユースケース金融、重要データ読み取り分散、分析

準同期レプリケーション

少なくとも1つのレプリカに同期、残りは非同期。 データ損失リスクと性能のバランス。MySQL Semi-Sync等。

レプリケーション構成

マスター・スレーブ(Primary-Replica)

1つのマスターが書き込みを受け付け、スレーブに複製。読み取りはスレーブに分散可能。

Primary
Write/Read
Replica 1
Read
Replica 2
Read

マルチマスター

複数のノードが書き込みを受け付け。コンフリクト解決が必要。 Galera Cluster、CockroachDB等。

カスケードレプリケーション

レプリカから別のレプリカに複製。マスターの負荷を軽減。 地理的に分散した構成に有効。

フェイルオーバー

自動フェイルオーバー

監視システムが障害を検知し、自動的にレプリカを昇格。 ダウンタイム短縮。スプリットブレインに注意。

例: PostgreSQL + Patroni, MySQL + Orchestrator

手動フェイルオーバー

運用者が判断して切り替え。確実だが時間がかかる。 計画的メンテナンス向き。

レプリケーションラグ

非同期レプリケーションでは、マスターとレプリカ間でデータの遅延が発生する。

  • 問題: 書き込み直後の読み取りで古いデータが返る
  • 対策: Read-your-writes一貫性、クリティカルリードはPrimaryから
  • 監視: レプリケーションラグのメトリクスを常時監視
1-- PostgreSQL: レプリカラグ確認
2SELECT
3 client_addr,
4 state,
5 pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS sent_lag,
6 pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag
7FROM pg_stat_replication;
8
9-- MySQL: レプリカラグ確認
10SHOW SLAVE STATUS\G
11-- Seconds_Behind_Master を確認

SRE/インフラ観点

構成の推奨

  • • 最低3ノード(Primary + 2 Replica)で冗長性確保
  • • 同期レプリカを1つは維持(データ保護)
  • • 異なるAZ/リージョンに配置(災害対策)

監視項目

  • • レプリケーションラグ(秒、バイト)
  • • レプリカの接続状態
  • • WAL/Binlog の生成・送信量
  • • フェイルオーバー履歴