PostgreSQL ストリーミングレプリケーション (primary + standby)
PostgreSQLレベル: 中級所要時間: 45〜90 分構築済みの primary に pg_basebackup で 1 台以上の hot standby を追加し (レプリケーションユーザー、pg_hba、replication slot、非同期または同期 ANY/FIRST モード、遅延監視)、Patroni を使わないこのクラスタの運用 runbook を生成します: 計画 switchover、手動 failover (pg_promote)、旧 primary の pg_rewind による再参加、standby の再構築、カスケードおよび遅延 standby、slot の整理、同期設定の変更。failover は自動ではなく DBA が実施します。自動 failover は pg-patroni、テーブル単位またはバージョン間のデータ連携は pg-logical-repl を使用してください。
構成: 1 primary + 1..N standby
シナリオ
- 構築: primary に standby を追加する — 構築済みの primary に pg_basebackup で 1 台以上の hot standby を追加します (slot、同期/非同期、監視)。primary は稼働したままですが、初回コピーは primary にディスクとネットワークの負荷をかけます。
- 計画 switchover (ロール切り替え、データ損失なし) — 計画メンテナンス: primary を正常停止し、最初の standby を昇格させ、旧 primary を standby として戻します。データ損失はなく、書き込み停止は通常 1 分未満です。
- 手動 failover (primary 障害、standby を昇格) — primary が停止した、または到達できない場合: 旧 primary を隔離 (fencing) し、最新の standby を手動で昇格させます。非同期モードでは直近のトランザクションが失われる可能性があります。
- 旧 primary を pg_rewind で standby として再参加させる — failover 後、旧 primary を pg_rewind で新 primary に同期させ、standby として再参加させます。フルコピーよりはるかに高速です。
- standby から供給される新しい standby を追加する (カスケード) — 新しい standby は WAL を primary ではなく最初の standby から受け取ります。遠隔データセンターや standby が多い構成で、primary のネットワーク/WAL 送信負荷を減らせます。primary には影響しません。
- 遅延 (delayed) standby を構築する — WAL を数時間遅れで適用する standby (recovery_min_apply_delay): 誤って削除したデータをバックアップからリストアせずに復旧するためのものです。failover 候補ではありません。
- standby をゼロから再構築する — standby が大きく遅れた、必要な WAL が削除された、または破損した場合: データディレクトリを退避し、primary から再コピーします。primary には影響しません。
- pg_wal が増え続けディスクが逼迫する (未使用 slot の削除) — WAL が溜まる原因 (非アクティブな slot、アーカイブ失敗、wal_keep_size) を特定し、未使用の replication slot を削除して WAL 領域を回収します。primary は稼働したままです。
- 同期 standby の追加 / 除外 (synchronous_standby_names) — フォームのモード (ANY/FIRST, k) に従って同期リストを書き直すか、非同期に戻します。reload で反映され、再起動は不要です。設定を誤るとコミットが待機したままになるため、先に確認します。
開始前の確認
- primary … は pg-install ガイドで構築済みで稼働中です (PostgreSQL …、PGDATA …、ポート …)。
- standby サーバーでは pg-install ガイドの OS 準備フェーズ (hostname、chrony、sysctl、THP) のみ実施済みです。クラスタは作成していません。ソフトウェアはこのガイドでインストールします。
- 全サーバーで OS ファミリー、アーキテクチャ (x86_64/aarch64)、PostgreSQL のメジャーバージョン (…) が同じであること。standby は primary の完全な物理コピーです。
- standby の … に、primary のデータサイズより 20% 以上多い空き容量があること。
- サーバー同士がポート … で通信でき、ホスト名が解決でき、時刻が NTP で同期していること。
- ファイアウォールでサーバー間のポート … が開いていること (pg-install でアプリケーション用ネットワークのみ開けた場合は、レプリケーション用 IP も追加してください)。
- Debian/Ubuntu では設定ファイルがデータディレクトリの外 (/etc/postgresql) にあるため、pg_basebackup ではコピーされません。standby から primary へ root (または sudo 権限のあるユーザー) で scp できるか、ファイルを手動で移す必要があります。
- 旧 primary のデータディレクトリが無傷で、サーバーを起動できること (ディスク障害の場合は pg_rewind ではなく pg_basebackup による再構築が必要です)。
- …primary に負荷をかける初回コピー (pg_basebackup) に適した時間帯を選んであること。…メンテナンス時間帯に入っており、アプリケーションチームが短時間の書き込み停止を把握していること。…primary が本当に到達不能であることを確認済みで、復帰して 2 台目の primary として書き込みを受け付けないことが保証されていること (fencing)。…新 primary が正常で、書き込みを受け付けていること。…新サーバー (…) の準備ができていること: OS 準備済み、… は空で十分な容量があり、初回コピーは送信元 (…) に負荷をかけます。…… の再構築中、参照負荷を他のサーバーに移せること。コピーは primary に負荷をかけます。…ディスク使用率を監視しており、slot を削除する前に、その slot を使う standby の担当者と調整済みであること。…同期設定の変更はメンテナンス時間帯に行い、コミットのレイテンシが変わるためアプリケーションチームに周知済みであること。…
ガイドのフェーズ
- 準備 (全サーバー) — サーバー名を /etc/hosts に追加する · PGDG リポジトリを追加する · PGDG リポジトリを追加する · PostgreSQL サーバーソフトウェアをインストールする · データディレクトリを準備する · クラスタ設定を作成し、データディレクトリを空にする
- primary でのレプリケーション準備 — pg_rewind の前提条件を確認する · レプリケーション設定ファイルを書く · 設定を読み込む · レプリケーションユーザーを作成する · レプリケーションユーザーのパスワードを設定する · pg_hba.conf にレプリケーション用ルールを追加する …
- standby の構築 (pg_basebackup) — primary へのレプリケーション接続をテストする · primary のコピーを取得する: … · primary から設定ファイルをコピーする · standby を起動する
- 検証 — primary でレプリケーション状態を確認する · standby で WAL 受信プロセスを確認する · primary にテストデータを書き込む · standby でテストデータを読む · テストテーブルを削除する
- 同期レプリケーションを有効にする — 同期設定ファイルを書く · 全サーバーで設定を読み込む · 同期状態を検証する
- 監視と構築後の作業 — 遅延監視クエリ (primary) · 遅延監視クエリ (standby) · slot 使用量の監視 · アプリケーションの接続文字列 · バックアップを standby 構成に合わせる
- switchover 前の確認 — standby の状態を確認する · 新 primary の準備ができていることを確認する · 旧 primary の .pgpass と pg_hba を確認する
- switchover — 旧 primary を正常停止する · 新 primary が最後の WAL を受信したことを確認する · … を promote する · 新 primary に slot を作成する · 旧 primary を standby として設定する · 旧 primary を standby として起動する …
- 手動 failover — 旧 primary を停止して無効化する (fencing) · 最新の standby を特定する · … を promote する · 同期待機を一時的に解除する · 新 primary に slot を作成する · 他の standby を新 primary に向ける: … …
- 旧 primary を pg_rewind で再参加させる — 新 primary で slot と接続ルールを確認する · 旧 primary が停止していることを確認する · pg_rewind の試行実行 · pg_rewind を実行する · standby 設定を仕上げる · 旧 primary を standby として起動する …
- pg_wal の肥大化と slot の整理 — pg_wal が増える理由 · slot の所有者を特定する · 未使用の slot を削除する: … · slot の削除: フォームに入力する · WAL 領域が回収されたことを確認する · 再発防止: 上限と監視
- 同期 standby の変更 — 現在の同期状態 · 安全確認: 十分な数の standby が接続しているか · 同期設定ファイルを書く · 同期設定を解除する (非同期に戻す) · 全サーバーで設定を読み込む · 新しい状態を検証する