RSS

pgpool-IIをテスト

pgpool-IIでレプリケーション+オンラインリカバリーのテストをしてみた。

いまいちドキュメントがわかりにくい。書いてあることは書いてあるんだけど、なんとなくわかりにくい。

recoveryの方法はrsyncでやった。PITRはそれ自体がどうなのかよくわかってないのでパス。

構成として1台のPCにpgpoolとPostgresのクラスターを2つ用意した。

環境はpgpool-II 2.2 / PosrgreSQL 8.3

レプリケーションまでの手順

debianのpgpool-IIのバージョンが古いので自分でコンパイルしてインストールした。
# pg_createcluster 8.3 cl0
# pg_createcluster 8.e cl1
とやってクラスターを二つ作る。

/usr/local/etc/pgpool.confを設定。長いので関係あるとこだけ抜粋。pidの場所とかは自分でどうぞ。

replication_mode = true
replication_stop_on_mismatch = true
次がリカバリーに関係する部分

recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'pgpool_recovery'
recovery_2nd_stage_command = 'pgpool_recovery'
バックエンドのクラスターの定義
replication_timeout = 5000
backend_hostname0 = 'localhost'
backend_port0 = 5433
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/8.3/cl0'
backend_hostname1 = 'localhost'
backend_port1 = 5434
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/8.3/cl1'
pcp.confの設定は省力。
/etc/postgres/8.3/cl[01]/pg_hba.conf は
host    all         all         127.0.0.1/32          trust
とりあえずこうしておく。ここまでやってreplicationがはいるようになった。

次はオンラインリカバリー

pgpool-IIのソースのpgpool-II-2.2/sql/pgpool-recoveryに移動する。
Cの拡張をいれる必要があるので、ここでmake; make installを実行。このあと各クラスターを再起動。
psql -U postgres -p 15432 -f pgpool-recovery.sql template1
を実行。/var/lib/postgresql/8.3/pgpool_recoveryを作成。
#! /bin/sh

if [ $# -ne 3 ]
then
    echo "pgpool_recovery datadir remote_host remote_datadir"
    exit 1
fi

datadir=$1
DEST=$2
DESTDIR=$3

rsync -v -aurz --delete $datadir/global/                $DESTDIR/global/ &
rsync -v -aurz --delete $datadir/base/          $DESTDIR/base/ &
rsync -v -aurz --delete $datadir/pg_multixact/  $DESTDIR/pg_multixact/ &
rsync -v -aurz --delete $datadir/pg_subtrans/   $DESTDIR/pg_subtrans/ &
rsync -v -aurz --delete $datadir/pg_clog/               $DESTDIR/pg_clog/ &
rsync -v -aurz --delete $datadir/pg_xlog/               $DESTDIR/pg_xlog/ &
rsync -v -aurz --delete $datadir/pg_twophase/   $DESTDIR/pg_twophase/ &
wait
/var/lib/postgresql/8.3/pgpool_remote_start
#! /bin/bash
if [ $# -ne 2 ]
then
    echo "pgpool_remote_start remote_host remote_datadir"
    exit 1
fi
DEST=$1
DESTDIR=$2

pg_ctlcluster 8.3 $(basename $DESTDIR) start
このふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。

想定手順

実際の運用はこんな手順かな。cl0を止めた、あるいは勝手に止まった想定。
# pg_ctlcluster 8.3 cl0 stop
# /usr/local/bin/pcp_detach_node 30 localhost 9898 postgres postgres 0
# /usr/local/bin/pcp_recovery_node 30 localhost 9898 postgres postgres 0
てな具合です。