ErogameScapはpgpoolのレプリケーションモードを使っています。
※PostgreSQLのVerが9.3なのでPostgreSQLのストリーミングレプリケーションとpgpoolのマスタースレーブモードを使うのがスマートだと思うのですが、レプリケーションモードで不自由していないのでレプリケーションモードのままです…
pgpoolのレプリケーションモードでオンラインリカバリをする場合のrecovery_2nd_stage.shの内容について、googleで「pgpool オンラインリカバリ」で検索すると2014-01-05時点以下の文書が引っかかります。
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
が書いてありますが、この文はいらないです。
pgpoolのオンラインリカバリの動作はざっくりと以下のような内容です。
1. リカバリ先にリカバリ元のデータを全部コピーする
2. リカバリ元へのクエリの受付を停止する
3. 1.~2.の間に更新された内容が、archive_logディレクトリ配下にあるので、リカバリ元のarchive_logの内容をリカバリ先のarchive_logにコピーする
4. リカバリ先のPostgreSQLを立ち上げる
recovery_2nd_stage.shに
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
と書いているのは、3.の動作を実現するためです。
1.の動作の中に
cp $RECOVERY_BASEDIR/archive_log/%f %pと書いたrecovery.confをリカバリ先に置く
という動作があります。
PostgreSQLはrecovery.confがあると、recovery.confに書かれた内容を実行してPostgreSQLサーバを立ち上げます。
cp $RECOVERY_BASEDIR/archive_log/%f %p
は
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
とやっていることが同じです。
したがって、 recovery_2nd_stage.shに
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
を書く必要はありません。
※pgpoolのオンラインリカバリの仕組みはPostgreSQLのオンラインバックアップの仕組みを理解している必要があります。pgpoolのオンラインリカバリのドキュメントだけを読むと、recovery_2nd_stage.shの中にarchive_log配下をコピーする何かを書かなくてはいけない気がしますが…というか、私もそう思っていましたが、rsyncが書いていない文書もあるし、たしかにrsyncが書いていなくても、ちゃんと動いているし、なんでかな…と思って調べて理解しました。
※PostgreSQLのVerが9.3なのでPostgreSQLのストリーミングレプリケーションとpgpoolのマスタースレーブモードを使うのがスマートだと思うのですが、レプリケーションモードで不自由していないのでレプリケーションモードのままです…
pgpoolのレプリケーションモードでオンラインリカバリをする場合のrecovery_2nd_stage.shの内容について、googleで「pgpool オンラインリカバリ」で検索すると2014-01-05時点以下の文書が引っかかります。
- pgpool-II ユーザマニュアル(2013/09/06)
- SE奮闘記: 【PostgreSQL】pgpool-Ⅱでレプリケーション、インストールと設定(2009/04/13)
- 「pgpool-II」でオンラインリカバリの手順(2011/12/14)
- pgpool-IIのオンラインリカバリの概要(2009/02)(PDF)
- pgpoolオンラインリカバリ 備忘録 | へっぽこSE奮闘記(2009/09/09)
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
が書いてありますが、この文はいらないです。
pgpoolのオンラインリカバリの動作はざっくりと以下のような内容です。
1. リカバリ先にリカバリ元のデータを全部コピーする
2. リカバリ元へのクエリの受付を停止する
3. 1.~2.の間に更新された内容が、archive_logディレクトリ配下にあるので、リカバリ元のarchive_logの内容をリカバリ先のarchive_logにコピーする
4. リカバリ先のPostgreSQLを立ち上げる
recovery_2nd_stage.shに
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
と書いているのは、3.の動作を実現するためです。
1.の動作の中に
cp $RECOVERY_BASEDIR/archive_log/%f %pと書いたrecovery.confをリカバリ先に置く
という動作があります。
PostgreSQLはrecovery.confがあると、recovery.confに書かれた内容を実行してPostgreSQLサーバを立ち上げます。
cp $RECOVERY_BASEDIR/archive_log/%f %p
は
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
とやっていることが同じです。
したがって、 recovery_2nd_stage.shに
rsync -az -e ssh $MASTER_BASEDIR/archive_log/ $RECOVERY_HOST:$RECOVERY_BASEDIR/archive_log/
を書く必要はありません。
※pgpoolのオンラインリカバリの仕組みはPostgreSQLのオンラインバックアップの仕組みを理解している必要があります。pgpoolのオンラインリカバリのドキュメントだけを読むと、recovery_2nd_stage.shの中にarchive_log配下をコピーする何かを書かなくてはいけない気がしますが…というか、私もそう思っていましたが、rsyncが書いていない文書もあるし、たしかにrsyncが書いていなくても、ちゃんと動いているし、なんでかな…と思って調べて理解しました。