PostgreSQL レプリケーションとHA構成ガイド
このドキュメントでは、PostgreSQLのレプリケーションと高可用性(HA)構成を解説します。
目次
- レプリケーションの概要
- ストリーミングレプリケーション
- 同期レプリケーション
- 論理レプリケーション
- レプリケーションスロット
- フェイルオーバー
- Patroniによる自動フェイルオーバー
- 読み取り負荷分散
1. レプリケーションの概要
1.1 レプリケーションの目的
┌──────────────────────────────────────────────────────────────┐
│ レプリケーションの目的 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 【高可用性 (High Availability)】 │
│ - プライマリ障害時にスタンバイに切り替え │
│ - ダウンタイムの最小化 │
│ - RPO (データ損失) の最小化 │
│ │
│ 【読み取りスケーリング】 │
│ - 読み取りクエリをスタンバイに分散 │
│ - プライマリの負荷軽減 │
│ - レポート/分析クエリの分離 │
│ │
│ 【災害対策 (Disaster Recovery)】 │
│ - 地理的に離れた場所にレプリカを配置 │
│ - データセンター障害への対策 │
│ │
│ 【メンテナンス】 │
│ - ローリングアップグレード │
│ - スタンバイでのバックアップ取得 │
│ │
└──────────────────────────────────────────────────────────────┘
1.2 レプリケーション方式の比較
┌── ────────────────────────────────────────────────────────────┐
│ レプリケーション方式の比較 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 【ストリーミングレプリケーション】(物理) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ✅ WALをそのまま送信 → 完全なレプリカ │ │
│ │ ✅ 設定が比較的シンプル │ │
│ │ ✅ PITRと組み合わせ可能 │ │
│ │ ❌ クラスタ全体の複製のみ (テーブル単位不可) │ │
│ │ ❌ 同一メジャーバージョン間のみ │ │
│ │ ❌ 同一アーキテクチャ間のみ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 【論理レプリケーション】 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ✅ テーブル/データベース単位で選択可能 │ │
│ │ ✅ 異なるメジャーバージョン間で可能 │ │
│ │ ✅ サブスクライバー側で追加のインデックス作成可能 │ │
│ │ ❌ DDLは複製されない │ │
│ │ ❌ シーケンス、ラージオブジェクトは複製されない │ │
│ │ ❌ 設定が複雑 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 【選択の指針】 │
│ - HA/DR目的 → ストリーミングレプリケーション │
│ - 部分的な複製、異バージョン間 → 論理レプリケーション │
│ │
└──────────────────────────────────────────────────────────────┘
2. ストリーミングレプリケーション
2.1 アーキテクチャ
┌──────────────────────────────────────────────────────────────┐
│ ストリーミングレプリケーション │
├──────────────────────────────────────────────────────────────┤
│ │
│ Primary Standby │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ │ │ │ │
│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ │ Backend │ │ │ │ WAL Receiver │ │ │
│ │ └───────┬───────┘ │ │ └───────┬───────┘ │ │
│ │ │ write │ │ │ apply │ │
│ │ ▼ │ │ ▼ │ │
│ │ ┌───────────────┐ │ WAL │ ┌───────────────┐ │ │
│ │ │ WAL │ │ Stream │ │ WAL │ │ │
│ │ │ Buffer │──┼──────────→ │ │ Buffer │ │ │
│ │ └───────┬───────┘ │ │ └───────┬───────┘ │ │
│ │ │ │ │ │ │ │
│ │ ▼ │ │ ▼ │ │
│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ │ pg_wal/ │ │ │ │ pg_wal/ │ │ │
│ │ └───────────────┘ │ │ └───────────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ▼ │ │ ▼ │ │
│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ │ Data Files │ │ │ │ Data Files │ │ │
│ │ └───────────────┘ │ │ └───────────────┘ │ │
│ │ │ │ │ │
│ │ Read/Write │ │ Read Only │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ 【プロセス】 │
│ Primary: WAL Sender プロセスがWALを送信 │
│ Standby: WAL Receiver プロセスがWALを受信・適用 │
│ │
└──────────────────────────────────────────────────────────────┘
2.2 プライマリの設定
# postgresql.conf (Primary)
# WALレベル (replica以上が必要)
wal_level = replica
# WAL送信プロセスの最大数
max_wal_senders = 10
# レプリケーションスロット数
max_replication_slots = 10
# スタンバイへのWAL保持 (スロット未使用時)
wal_keep_size = 1GB
# アーカイブ (推奨)
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/archive/%f'
# ホットスタンバイからのフィードバック
hot_standby_feedback = on
# pg_hba.conf (Primary)
# レプリケーション接続を許可
host replication repl_user 192.168.1.0/24 scram-sha-256
-- レプリケーション用ユーザーの作成 (Primary)
CREATE ROLE repl_user WITH
LOGIN
REPLICATION
PASSWORD 'replication_password';
2.3 スタンバイの構築
# 1. プライマリからベースバックアップを取得
pg_basebackup -h primary_host -U repl_user -D /var/lib/pgsql/16/data \
-Fp -Xs -P -R
# -R オプションで以下が自動生成される:
# - standby.signal ファイル
# - postgresql.auto.conf に primary_conninfo が追加される