CentOS5.3 + Red Hat Cluster + PostgreSQL + Slony-I でテイクオーバーをやってみた (2)
slon についても、RHCSに組み込みたかったのだが、個別に init スクリプトとしてまとめる必要があり、面倒なため、RHCSを使わず、手動で起動することにしておいた。 w
この後、サービスとして、テイクオーバーをスクリプト化するのだが、基本的にはRHCSでテイクオーバーが実施される時はノード障害の場合等であり、デフォルトの動作としては、フェイルオーバーにしておくことになる。ただし、メンテナンスなどの時にはフェイルオーバーではなくmove_set を実施する必要があるため、そちらをスクリプトに検出させる方法も必要になる。
一応、筆者は /tmp 以下に slony_maintenance_time というファイルを作り、それの有り無しでfailover, move_set を切り替えるようにした。 テイクオーバースクリプトは status を確認したり、リソース移動を行うために両側で作業を行う必要があるサービスではないため、 start だけを記述し、stop, status は 0 を返すだけにしておいた。作成したスクリプトは次のようになる。
start (){ # master ノード: 1
if [[ -f /tmp/slony_maintainance_time ]]
then
su -l postgres -c "slonik_move_set 1 2 1 | grep -v wait | slonik"
else
# su -l postgres -c "slonik failover 1 1 | slonik "
fi
return 0
}
start (){ # slaveノード: 2
if [[ -f /tmp/slony_maintainance_time ]]
then
su -l postgres -c "slonik_move_set 1 1 2 | grep -v wait | slonik"
else
# su -l postgres -c "slonik failover 1 1 | slonik "
fi
return 0
}
stop () {
return 0
}
status () {
return 0
}
case "$1" in
start)
start
script_result=$?
;;
stop)
stop
script_result=$?
;;
status)
status
script_result=$?
;;
*)
echo $"Usage: $0 {start|stop|status}"
exit 1
esac
exit $script_result
start コマンドが2つあるが、これは、最初にマスターであるノード(1)と、スレーブであるノード(2) でmove_set を開始するコマンドが違うため、2つ作ってある。 このスクリプトをRHCSに登録し、 /tmp/slony_maintainance_time を作成し、
# clusvcadm -r slony_failover
を実施することで、レプリケーションの方向が入れ替わることを確認した。
後は、フェイルオーバーだが、前回も書いた通り、フェンスデバイス(特に
fence_virsh) がCentOS 5.3 には含まれていないので、すぐに試すのは厳しそうだ。 CentOS 5.4 で追加されるらしいので、それまで待つか、もしくはFedora 11 からコピペするかだが ... 。 まずは、fence_virsh が難しい依存性を持っていないことを確認することにする 。。