CentOS5.3: Slony-I 2.0を使ってみた (3.1)

(3) のテイクオーバー(Slonyの用語ではスイッチオーバー)に続いて、フェイルオーバーも試してみた。

フェイルオーバーは一度行うと落ちた側のデータを全て削除しないと復旧が難しいらしい。基本的には行いたくないが、ハードウェア障害などの時にはフェイルオーバー以外の方法がないので、あくまで緊急での対応として実施する。。

方法は簡単で、

$ slonik_failover | slonik

と打つだけである。一応どちらで打ってもよいようだが、普通はFailしなかった方で打つことになるだろう。 ww

問題なのは実施した後の復旧方法なのだが、Failしていない方は依然としてSlony-I が使用するスキーマも持ってしまっているため、単純にslonik_init_cluster を使うことはできない。正しい方法なのかどうかはわからないが、筆者は次の方法でFailノードを復旧することができた。

1 両ノードで slon_kill
2 FailしたノードでDB再作成, createlang, テーブル作成を実施
3 slon_tool.conf でマスターノードをFailしなかったノードに変更
4 slonik_store_node でFailしたノードに、メタデータ再作成
5 slonik_drop_set でsetの情報を削除(Failしなかった側のため)
6 slonik_create_set でsetの情報を再作成
7 両ノードで slon_start
8 slonik_subscribe_node でレプリケーション開始 => レプリケーションが行われていることを確認する
9. (レプリケーションがが追いつくまで待つ)
10. slon_tool.conf でマスターノードをFailしたノードに変更
11. slonik_move_set でマスターノードを変更

ハマりポイントとしては、3. でMASTERNODE の項目を編集することがある。忘れると、新規作成のDBからレプリケーションが行われてしまいデータが消えてしまう orz ので注意が必要だ。。

それと、5, 6 ではFailしなかった側にset の情報が残っていたので一旦drop_set, create_set で復旧したのだが、これが正しい手順なのかはよくわからない。

10, 11 はマスターノードを元のノードに戻すために行っているが、そのままの筐体で動かすなら特に行わなくてもよさそうだ。

実際にやってみてわかったのだが、復旧作業はかなり繊細な作業で、メタデータの不整合などで操作が上手くいかないことも多々あった。一応上記の方法で上手くいきそうなのだが、何度か試してみてノウハウを集めることも必要そうだ。 orz