ソースからpgpool-II3.3.4をインストールしました。 2つのpgpoolノードがあり、ウォッチドッグ構成を使用して、高可用性を備えたpgpoolサービスを取得しました。一方を止めると、もう一方が目覚め、すべてが順調です。
また、マスターとスレーブの2つのバックエンドがあり、フェイルオーバーコマンドを構成しました。これが私の問題です。マスターを停止すると、pgpoolはフェイルオーバーを実行しません。
私のバックエンドがあります:
backend_hostname0 = '172.23.0.70'
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = '/var/lib/postgresql/9.3/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '172.23.10.21'
backend_port1 = 5432
backend_weight1 = 0
backend_data_directory1 = '/var/lib/postgresql/9.3/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'
私のフェイルオーバーコマンド宣言があります:
failover_command = 'failover.sh %d %M %m'
もちろん、フェイルオーバーをpgpoolノードの/ sbin /ディレクトリにコピーしました。 failover.shスクリプトコードがあります:
#!/bin/sh
FALLING_NODE=$1
# The new master
SLAVE1="172.23.10.21"
if test $FALLING_NODE -eq 0
then
ssh -T postgres@$SLAVE1 "touch /tmp/postgresql.trigger.5432"
ssh -T postgres@$SLAVE1 "while test ! -f /var/lib/postgresql/9.3/main/recovery.done; do sleep 1; done;"
ssh -T postgres@$SLAVE1 "/etc/init.d/postgresql restart"
/usr/local/bin/pcp_attach_node 10 localhost 9898 pgpool pgpool 1
fi
さて、failover.shを手動で実行すると機能するのに、なぜpgpoolで実行されないのでしょうか。
私はSudoユーザーでpgpoolを実行しているので:
スクリプトの実行にも問題がありました。しかし、最終的にそれを理解しました。
覚えておくべきいくつかの高レベルのステップ。
フェイルオーバースクリプトで、結果を次のようなログファイルにリダイレクトします。
ssh -T postgres@$SLAVE1 "touch /tmp/postgresql.trigger.5432" > /tmp/failover.log 2>&1
これは、失敗している理由を特定するのに役立つ場合があります。
ただし、フェイルオーバースクリプトを実行する方法の概要は次のとおりです。
ssh-keygen -t rsa
pgpoolサーバー上およびcat id_rsa.pub
および>>
からauthorized_keys
dbサーバー上そうすることで、対話型認証なしでスクリプトを実行できるようになります。これが私の問題でした。