レプリケーション・分散

Primary-Replica、シャーディング、HA、フェイルオーバー、Read Replica の使い方、 分散 SQL DB(CockroachDB / Spanner)まで。

レプリケーションの目的

  1. HA(高可用性)— Primary が落ちても Replica が引き継ぐ
  2. Read 拡張 — 読み取りを Replica に分散
  3. 地理分散 — 各リージョンに Replica
  4. 分析専用 — 本番に影響を与えず集計
  5. バックアップ — Replica からダンプ

方式

1. Primary-Replica(Master-Slave)

[Primary]  ─── WAL ───>  [Replica 1]
                          [Replica 2]
                          [Replica 3]

書き込み: Primary のみ
読み取り: 全部
      

2. Multi-Primary(Multi-Master)

3. レプリカ無し(単一 DB)

Postgres のレプリケーション

物理レプリケーション(Streaming Replication)

論理レプリケーション

同期 vs 非同期

方式挙動
非同期(既定)Primary が COMMIT 後、非同期で Replica へ送信。データ損失の可能性
同期Replica の書き込みも待ってから COMMIT。安全だが遅い
QuorumN 台中 M 台が ACK したら COMMIT

レプリカラグ

Read Replica の使い方(アプリ側)

// 書き込み
await primary.query("INSERT ...")

// 読み取り(重い分析、最新性が要らない)
await replica.query("SELECT ...")

// Read Your Writes が必要なケース
await primary.query("SELECT ...")

Prisma は readReplicas 拡張で振り分け可能。

シャーディング

データを複数のサーバに水平分割する。1 台で持ちきれない量に対応。

ユーザ ID で分割(hash sharding)
  user 1〜1000     → Shard A
  user 1001〜2000  → Shard B
  user 2001〜3000  → Shard C
      

シャーディングの方式

難しいところ

Postgres のシャーディング

分散 SQL DB(NewSQL)

SQL を保ったまま自動でシャーディング + レプリケーション + 強整合。

書き込み性能を求めて結局 Postgres + Citus / マネージド分散 DB / NoSQL に行くケースが増えている。

HA(高可用性)

RPO / RTO

典型構成

[Primary]
   ↓ 同期レプリケーション
[Sync Replica]   ← 自動フェイルオーバー
   ↓ 非同期
[Async Replica 1, 2]
      

フェイルオーバー

マネージド DB の比較

サービス特徴
AWS RDS / Aurora定番、Aurora は読み拡張に強い
Google Cloud SQL / AlloyDBGCP 統合
Azure DatabaseMicrosoft 環境
SupabaseBaaS としてのフルスタック
NeonServerless Postgres、ブランチング
PlanetScaleMySQL ベース、ブランチング
Crunchy Bridgeシンプルな Postgres ホスティング
Render / Railway個人〜小規模
Vercel PostgresVercel と密結合
Prisma PostgresPrisma 公式

バックアップ戦略

地理分散の選択肢

CDC(Change Data Capture)

DB 変更をイベントストリームとして外部に流す:

用途: 検索 Index 同期、アナリティクス、マイクロサービス連携。

Connection Pooling と分散

失敗パターン

症状原因
書いた直後に読めないレプリカラグ。Primary から読む
Primary 落ちて全停止HA 設計してない / フェイルオーバー手順なし
シャーディング後に集計が遅いクロスシャードクエリ / OLAP は別 DB へ
WAL 溜まりすぎReplica 接続切れたまま放置
バックアップから戻せない復元演習未実施。実際に試す

運用 Tips

原則

大半のサービスは「単一 Postgres + Read Replica + Redis キャッシュ」で十分。 シャーディング / 分散 SQL に手を出す前に、Read 分散とキャッシュで稼げるかを試す。 そこを超えてから初めて分散 DB を検討。