Ponz Dev Log

ゆるくてマイペースな開発日記

PostgreSQLのpg_basebackupでレプリカを立てる

PostgreSQLのHA構成を組むにあたって、 ストリーミングレプリケーションできるレプリカ機を容易に立てられることに衝撃を受けたので備忘録です。 既に各所で既出ですが、自分にとって発見だったので書き留めます。

検証環境

以下のVMを2台立てて検証しました。

いきなり本題

pg_basebackup コマンドに-R オプションを渡して作成したベースバックアップを使ってPostgreSQLを起動するだけです。

このコマンドはオンラインバックアップを取得するコマンドです。 さらに -R オプションを渡すことでストリーミングレプリケーション可能なスタンバイ機に必要なファイルや設定が書き込まれます。

www.postgresql.jp

やってみる

事前にプライマリ機のPostgreSQLが起動済みであることを前提とします。

ベースベックアップを取得 & レプリカがストリーミングレプリケーションするため、プライマリ側にレプリケーション用のユーザー repl_user を作成しておきます。

postgres# CREATE ROLE repl_user LOGIN REPLICATION PASSWORD '<REPLICATION_USER_PASSWORD>';

続いてレプリカ側でベースバックアップを取得し、バックアップデータを使用してスタンバイを起動します。 レプリカ機のPostgreSQLを停止させた状態で実行します。

渡しているオプションの詳細はドキュメントを参照してください。

$ # ベースバックアップを取得
$ pg_basebackup --pgdata=/var/lib/pgsql/data/ --format=p -R --checkpoint=fast --host=192.168.xxx.xxx --port=5432 --username=repl_user --progress --verbose
pg_basebackup: ベースバックアップを開始しています - チェックポイントの完了を待機中
pg_basebackup: チェックポイントが完了しました
pg_basebackup: 先行書き込みログの開始ポイント: タイムライン 1 上の 0/4000028
pg_basebackup: バックグランドWAL受信処理を起動します
pg_basebackup: 一時レプリケーションスロット"pg_basebackup_nnnnn"を作成しました
pg_basebackup: 先行書き込みログの終了ポイント: 0/4000100
pg_basebackup: バックグランドプロセスがストリーミング処理が終わるまで待機します ...
pg_basebackup: データをディスクに同期しています...
pg_basebackup: backup_manifest.tmp の名前を backup_manifest に変更してください
pg_basebackup: ベースバックアップが完了しました

$ # レプリカ機のPostgreSQLサービスを起動
$ systemctl start postgresql-13.service

注意すべきはPostgreSQL 12以前では必要だったrecovery.confを作る必要はないことです。 PostgreSQL 12以降はこのファイルが廃止され、スタンバイ機を表す standby.signal ファイルに置き換えられています。 standay.signalは空ファイルです。

また、ストリーミングレプリケーションのために recovery.conf に記入する必要があった primary_conninfo パラメータは自分で設定する必要がありません。

pg_basebackup コマンドの -R コマンドを指定したことで自動的に postgresql.auto.conf に書き込まれます。

www.postgresql.org

参考

lets.postgresql.jp

www.enterprisedb.com


pg_dumpで取得した論理バックアップからレプリカを用意するよりも簡単かも。

以上。