PostgreSQL15 ストリーミングレプリケーションの復旧

Linux

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

手順

プライマリを停止

スタンバイをプライマリーに昇格

コマンド

プライマリを停止

#systemctl stop postgresql-15

スタンバイのアクセス制御変更

postgresql.auto.conf の primary_conninfo をコメントアウトしないといけないらしいが、手書きで変更するなと書いてある

# cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replication password=testpass channel_binding=prefer host=192.168.0.1 port=5481 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

スタンバイを再起動

systemctl restart postgresql-15

スタンバイをプライマリに昇格

/usr/psql-15/bin/pg_ctl -D /var/lib/postgresql/15/main promote

動作確認 新プライマリにデータが書き込みできるか?

ストリーミングレプリケーション稼働状況確認

ログを確認してみます

スタンバイサーバ、WALの書込みが完了しているのが分かります。

2023-10-01 16:13:48.798 JST [560939] LOG:  リカバリ再開ポイントは22/25218918です
2023-10-01 16:13:48.798 JST [560939] 詳細:  最後に完了したトランザクションはログ時刻 2023-10-01 16:10:37.722404+09 の
ものです

pg_admn でマスターサーバへデータ書き込み

wal_writer は200msごとに実行されているはず

#wal_writer_delay = 200ms               # 1-10000 milliseconds

検証

マスターサーバに書き込み

6:18:29 に書き込み

6:18:53 チェックポイントWAL書き込み

2023-10-02 06:18:29.087 JST [1058118] postgres@jp_bak1 文:  INSERT INTO dtest.tm_err (
        no, log_name, dt_write, note) VALUES (
        '2'::integer, 'test2'::text, 'now()'::timestamp without time zone, 'テスト書き込み2'::text)
         returning no;
2023-10-02 06:18:53.250 JST [759604] LOG:  チェックポイント開始: time
2023-10-02 06:18:53.468 JST [759604] LOG:  チェックポイント完了: 3個のバッファを出力 (0.0%); 0個のWALファイルを追加、0個を削除、0個を再利用; 書き出し=0.216秒, 同期=0.001秒, 全体=0.219秒; 同期したファイル=3, 最長=0.001秒,
平均=0.001秒; 距離=0 kB, 予測=794 kB

スタンバイサーバ

6:19:06 WAL読込完了

2023-10-02 06:19:06.202 JST [560939] LOG:  リスタートポイント開始: time
2023-10-02 06:19:06.912 JST [560939] LOG:  リスタートポイント完了: 8個のバッファを出力 (0.0%); 0個のWALファイルを追加
、0個を削除、0個を再利用; 書き出し=0.703秒, 同期=0.003秒, 全体=0.711秒; 同期したファイル=5, 最長=0.003秒, 平均=0.001秒; 距離=0 kB, 予測=794 kB
2023-10-02 06:19:06.912 JST [560939] LOG:  リカバリ再開ポイントは22/25218E08です
2023-10-02 06:19:06.912 JST [560939] 詳細:  最後に完了したトランザクションはログ時刻 2023-10-02 06:18:47.076607+09 の
ものです

およそ13秒でスタンバイサーバに反映されているのが分かります。

スタンバイサーバには書き込みができない事を確認

復旧試験

スタンバイサーバにて

Debianでは

# /usr/lib/postgresql/15/bin/pg_ctl -D /var/lib/postgresql/15/main/ promote
pg_ctl: rootでは実行できません
サーバープロセスの所有者となる(非特権)ユーザーとして("su"などを使用して)
ログインしてください。
# su postgres
$ /usr/lib/postgresql/15/bin/pg_ctl -D /var/lib/postgresql/15/main/ promote
サーバーの昇格を待っています....完了
サーバーは昇格しました

※postgresユーザで実行しないとできなかった。

スタンバイサーバのログ

2023-10-02 06:28:39.523 JST [560941] LOG:  昇格要求を受信しました
2023-10-02 06:28:39.523 JST [560942] FATAL:  管理者コマンドにより WAL 受信プロセスを終了しています
2023-10-02 06:28:39.524 JST [560941] LOG:  22/25218EF0のレコードの後方リンクE33B91BC/EF92BCEFが不正です
2023-10-02 06:28:39.525 JST [560941] LOG:  REDOが22/25218EB8で終了しました、システム使用状況: CPU: ユーザー: 7.01秒、
システム: 9.44秒、経過時間: 1428990.42秒
2023-10-02 06:28:39.525 JST [560941] LOG:  最後に完了したトランザクションのログ時刻は2023-10-02 06:18:47.076607+09でした
2023-10-02 06:28:39.536 JST [560941] LOG:  新しいタイムラインIDを選択: 2
2023-10-02 06:28:39.600 JST [560941] LOG:  アーカイブリカバリが完了しました
2023-10-02 06:28:39.604 JST [560939] LOG:  チェックポイント開始: force
2023-10-02 06:28:39.609 JST [560937] LOG:  データベースシステムの接続受け付け準備が整いました
2023-10-02 06:28:39.715 JST [560939] LOG:  チェックポイント完了: 3個のバッファを出力 (0.0%); 0個のWALファイルを追加、0個を削除、0個を再利用; 書き出し=0.104秒, 同期=0.002秒, 全体=0.111秒; 同期したファイル=3, 最長=0.002秒, 平均=0.001秒;
距離=0 kB, 予測=715 kB

昇格したスタンバイサーバにデータ書き込みできる事を確認

タイトルとURLをコピーしました