pgpool-IIをPITRでリカバリ
前回はrsyncでリカバリーをおこなったが今回はPITRを使う。
-
付与されたタグ:
- PostgreSQL
やってしまえば簡単な話なんだが、それまでにいろいろ試行錯誤。結果的にPITRのことがわかるようになった。流れは次のとおり。
- WALのアーカイブログを取るように設定
- pg_functionの設定(省略)
- pgpool.confの設定とリカバリーのスクリプトの作成
まずそれぞれのクラスターがWALのアーカイブをするように設定する。cl0,cl1/postgresql.confの設定を行う。
archive_mode = on
archive_command = 'cp -f %p archive_log/%f'
と設定する。archive_command を
test ! -f archive_log/%f && /bin/cp %p archive_log/%f'
という説明もあるのだが、これやるとエラーになってしまう。
次にpgpool関係の設定。recovery_1st_stage.shを以下のとおり。色々デバッグメッセージが出るので注意。
#!/bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -c "select pg_start_backup('pgpool-recovery')" postgr
es
echo "restore_command = 'cp -v $RECOVERY_BASEDIR/archive_log/%f %p'" > $MASTER_BASEDIR/recovery.conf
rsync -av $MASTER_BASEDIR/ $RECOVERY_BASEDIR/
rm -f $RECOVERY_BASEDIR/postmaster.pid
rm -f $MASTER_BASEDIR/recovery.conf
psql -h localhost -p $PORT -c 'select pg_stop_backup()' postgres
次にrecovery_2nd_stage.shを設定する。
#! /bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -U postgres -c 'select pg_switch_xlog()' postgres
rsync -av $MASTER_BASEDIR/archive_log/ $RECOVERY_BASEDIR/archive_lo
それぞれのファイルを$PGDATAの中に配置。
pgpool.confは次のように設定。
recovery_1st_stage_command = 'recovery_1st_stage.sh'
recovery_2nd_stage_command = 'recovery_2nd_stage.sh'
これで同じようにpcp_recovery_nodeを動かせばいい。いろいろと雑だが一応動く。