postgres用のレプリケーションツール pgpool-IIを導入した際にハマったポイントのメモ
■前提条件
・設定については、IBMさんが出している「pgpool-II 導入・設定ガイド」を元に行ってます。
http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-0076E4FE
■WALのアーカイブログの設定について
postgres.confの設定にて
archive_command = 'test | -f /pgsql/archlog/%f && /bin/cp %p /pgsql/archlog/%f'
という記述があります。
これだと、だとオンラインリカバリ実行後、障害が発生していたノードにてエラーが多発しました。
----エラー内容----
LOG: archive command failed with exit code 1
DETAIL: The failed archive command was: test ! -f /pgsql/archlog/00000002.history && /bin/cp pg_xlog/00000002.history /pgsql/archlog/00000002.history
----エラー内容ここまで----
他のサイトを参考に、
× : archive_command = 'test | -f /pgsql/archlog/%f && /bin/cp %p /pgsql/archlog/%f'
○ : archive_command = 'cp -f %p /pgsql/archlog/%f'
として回避しています。
※ 恐らくcpコマンドに -f オプションをつければ大丈夫なのではないかと思います。
■pgpool_copy_backupでのログ出力
オンラインリカバリ用のシェルにてログを出力させるべく
----
#!/bin/sh
ARCLOG=/pgsql/archlog
SRC=postgres@$(hostname)
SRCDIR=$1
DEST=postgres@$2
DESTDIR=$3
LOG_FILE=/var/log/pgpool_copy_backup.log
echo "pgpool_copy_backup `date +%Y-%m-%d\ %H:%M:%S`" >> $LOG_FILE
echo "psql -c select pg_start_backup(pgpool-recovery) `date +%Y-%m-%d\ %H:%M:%S`" >> $LOGFILE
psql -c "select pg_start_backup('pgpool-recovery')"
echo "ssh $DEST rm -rf $DESTDIR/pg_xlog `date +%Y-%m-%d\ %H:%M:%S`" >> $LOGFILE
ssh $DEST "rm -rf $DESTDIR/pg_xlog"
・・・
----
といった感じでechoを書きまくってみたのですが、ログの出力がされませんでした。
実はrecovery_nodeを叩くのはrootでも、pgpool_copy_backupシェルを実行するアカウントがpostgresアカウントとなっている為、ログファイル(フォルダ)へのWrite権限が必要だったという落ちでした。
■pgpool_copy_backup、pgpool_switch_xlog での psqlコマンド
サンプルでは各シェルに
psql -c "select pg_start_backup('pgpool-recovery')" postgres
psql -c 'select pg_switch_xlog()' postgres
という記述になっています。
我々が今回作成した構成は、pgpoolとpostgresを同一サーバに同居させ、
・pgpool:ポート5432
・postgres:ポート55432
としたのですが、この環境だとサンプルのスクリプトのままだとリカバリーがうまく動作しませんでした。
で、直したのが以下のような感じ。
#!/bin/sh
ARCLOG=/pgsql/archlog
SRC=postgres@$(hostname)
SRCDIR=$1
DEST=postgres@$2
DESTDIR=$3
POSTGRES_PORT=55432
psql -c "select pg_start_backup('pgpool-recovery')" -U postgres -p $POSTGRES_PORT
pgpoolとpostgresを同居させる場合は注意しましょう。
---- 2010.10.01 追記 ----
■オンラインリカバリ用ユーザの作成
pgpool.confの設定にて
recovery_user = 'pgpool'
というように、「pgpoolユーザにてリカバリを行う」という設定にしてあります。
その為、リカバリ対象となるpostgreSQLのユーザとして、pgpoolというアカウントを作成する必要があります。
>su - postgres
> createuser -p 55432 pgpool #postgreSQLは55432で動かしている為。
(super userか聞かれるので yesを選択)
※ これが無いと、pcp_recovery_node の次の処理(recovery_1st_stage_command =に設定してあるシェル)まで辿り着きません。
■セカンドステージのコマンド追加(アーカイブログのsync)
IBMのpgpool-II 導入・設定ガイドに抜けている項目を追加
IBM資料では、セカンドステージのシェル(pgpool.conf recovery_2nd_stage_commandにて指定したpgpool_switch_xlog)で実行するコマンドはログ切り替えを行う
>psql -c 'select pg_switch_xlog()' postgres
だけしか書いていない。
これだけだと駄目で、アーカイブログを転送してあげる必要がある。
(でないと、セカンドステージの意味がない・・・)
という訳で下記を追加。
>MASTER_BASEDIR=$1
>RECOVERY_HOST=$2
>RECOVERY_BASEDIR=$3
>rsync -az -e ssh $MASTER_BASEDIR/archlog/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archlog/
これでセカンドステージにて、差分の反映を正しく行ってくれるようになります。

2