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