1.6. オンラインリカバリを試してみる

Pgpool-IIは、「オンラインリカバリ」という技術を使ってダウンしたノードを復旧させることができます。 これはプライマリノードからデータをスタンバイノードへとコピーし、プライマリと同期させます。 それには長い時間がかかることがあり、その間にデータが更新されるかもしれません。 これは問題になりません。なぜなら、ストリーミングレプリケーション構成では、スタンバイはWALログを受け取り、それを適用することによってプライマリに追い付くことができるからです。 オンラインリカバリをテストするために、ノード0が落ちている先ほどのクラスタから始めましょう。

$ pcp_recovery_node -p 11001 0
Password: 
pcp_recovery_node -- Command Successful

$ psql -p 11000 -c "show pool_nodes" test
 node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay 
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------
 0       | /tmp     | 11002 | up     | 0.500000  | standby | 2173       | true              | 0
 1       | /tmp     | 11003 | up     | 0.500000  | primary | 0          | false             | 0
(2 rows)
      

pcp_recovery_nodeは、インストールされたPgpool-IIに含まれる管理コマンドの一つです。 引数の-pは、コマンドにアサインされたポート番号です。 pgpool_setupは11001に設定しています。 次の引数はターゲットになるノードIDです。 コマンドを実行すると、ノード0は"up"状態に復帰します。

pcp_recovery_nodeが実行するスクリプトは、pgpool.confで"recovery_1st_stage_command"として指定されています。 pgpool_setupがインストールするファイルはこれです。

#! /bin/sh
psql=/usr/local/pgsql/bin/psql
DATADIR_BASE=/home/t-ishii/tmp/Tutorial
PGSUPERUSER=t-ishii

master_db_cluster=$1
recovery_node_host_name=$2
DEST_CLUSTER=$3
PORT=$4

log=$DATADIR_BASE/log/recovery.log

$psql -p $PORT -c "SELECT pg_start_backup('Streaming Replication', true)" postgres

echo "source: $master_db_cluster dest: $DEST_CLUSTER" > $log

rsync -C -a -c --delete --exclude postgresql.conf --exclude postmaster.pid \
--exclude postmaster.opts --exclude pg_log \
--exclude recovery.conf --exclude recovery.done \
--exclude pg_xlog \
$master_db_cluster/ $DEST_CLUSTER/

rm -fr $DEST_CLUSTER/pg_xlog 
mkdir $DEST_CLUSTER/pg_xlog
chmod 700 $DEST_CLUSTER/pg_xlog
rm $DEST_CLUSTER/recovery.done
cat > $DEST_CLUSTER/recovery.conf $lt;$lt;REOF
standby_mode          = 'on'
primary_conninfo      = 'port=$PORT user=$PGSUPERUSER'
recovery_target_timeline='latest'
REOF

$psql -p $PORT -c "SELECT pg_stop_backup()" postgres