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 が難しい依存性を持っていないことを確認することにする 。。