RSS

pgpool-IIをPITRでリカバリ

前回はrsyncでリカバリーをおこなったが今回はPITRを使う。

やってしまえば簡単な話なんだが、それまでにいろいろ試行錯誤。結果的に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を動かせばいい。いろいろと雑だが一応動く。