pgpool-IIをテスト
pgpool-IIでレプリケーション+オンラインリカバリーのテストをしてみた。
-
付与されたタグ:
- PostgreSQL
- RDBMS
いまいちドキュメントがわかりにくい。書いてあることは書いてあるんだけど、なんとなくわかりにくい。
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 = 5000pcp.confの設定は省力。
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'
/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/var/lib/postgresql/8.3/pgpool_remote_start
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
#! /bin/bashこのふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。
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
想定手順
実際の運用はこんな手順かな。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