pg_standbyでのウォームスタンバイ設定

pg_standbyでのウォームスタンバイの設定に非常に手こずったのでいろいろ書いとく

実施環境

  • CentOS 5.5
  • PostgreSQL 8.3.11
    • ソースからインストールしたもの

pg_standbyのインストール

PostgreSQL8.3からは(ソースに)付属している

/usr/local/src/postgresql-8.3.11/contrib/pg_standby
make
make install

バックアップDBの準備

メインDB側のdataディレクトリをコピーしてバックアップ側のdataディレクトリを作る
その際、pg_xlogを中身は消去しておく

メインDB側の設定

postgresql.conf

# scpする場合は事前に公開鍵認証できるように設定しておくこと(各サーバのpostgresユーザー)
archive_mode = on
archive_command = 'scp %p hoge-host:/usr/local/pgsql/archive/%f'
archive_timeout = 10

# 起動
su - postgres
/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data

バックアップDB側の設定

archive_commandで指定している格納先ディレクトリを作成しておく

mkdir /usr/local/pgsql/archive
chown postgres:postgres archive

recovery.conf

restore_command = '/usr/local/pgsql/bin/pg_standby -l -t /usr/local/pgsql/data/failover /usr/local/pgsql/archive/ %f %p %r'

# バックアップDB側の起動

# postgresユーザー
su - postgres

# 起動
/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data

# 接続しようとするとこんな感じになる
psql -U postgres
psql: FATAL: the database system is stating up

メインDB側でデータの作成

データベースを作ってみてarchiveが送られるのを見る

# メイン側
create database test;

# アーカイブがバックアップ側に送られてるの確認
cd /usr/local/pgsql/archive
ls # あればOK

トリガーファイル作ってリカバリさせてみる

このトリガーファイルはpostgresユーザーで扱える権限に設定しておく必要がある。少しはまった

# postgresユーザー
su - postgres
touch /usr/local/pgsql/data/failover

トリガーファイルが作成されると自動的にリカバリしてpsqlコマンドで接続できるようになるはず
できたら適当に作ったデータがバックアップ側への反映されていることを確認する

追記(9/2)

リカバリーされるとrecovery.confがリネームされてrecovery.doneに変わる