2017年8月3日木曜日

リソースの自動フェイルバック禁止設定

というわけで前回、リソースが稼働しているノード(gemini)を強制停止、リソースが対向ノード(cancer)へ自動フェイルオーバーすることを確認した。
その後、gemini を起動させたら、リソースが自動でフェイルバックしてしまった。
これはあまりよろしくない、ということで、自動フェイルバックはしないように設定してみたい。
これは、resouce-stickiness というパラメータで制御するようだ。
ただ、resource-agent(ra)固有のパラメータではなく、汎用パラメータのようで、crm ra info ocf:IPaddr2 では表示されない。
そのために探すのに時間がかかった。
他にも汎用パラメータはあるようだけど、とりあえずはコレだけ調べがついた。

取り急ぎ、設定を反映させる手順を。
手順としては2種類。
  • 既に作成済みのリソース、iptest に対して設定を追加するやり方
  • 一旦リソースを削除し、新たに作成するやり方
だ。
既に稼働中のシステムに対しては前者を使用することになるが、新たにリソースを作成するときには後者の知識があったほうが便利だ。
そのため、両方を試してみよう。

まずは前者、既に作成済みのリソースに対して設定を追加するやり方。
$ sudo crm configure show testip
$ sudo crm resource meta testip show resource-stickiness
そんなパラメータ無い!と怒られる。
$ sudo crm resource meta testip set resource-stickiness INFINITY
$ sudo crm configure show testip
$ sudo crm resource meta testip show resource-stickiness
設定できた。

果たしてこれでいいのだろうか?
前回と同じように試してみよう。

まずは手作業でフェイルオーバーだ。
$ sudo crm resource migrate testip
$ sudo crm resource show testip
$ sudo crm configure show
gemini で動いていた testip が cancer に移動した。

元に戻そう。
$ sudo crm resource unmigrate testip
$ sudo crm resource show testip
…あれ?戻らなかったぞ?
ちなみに
--
location cli-ban-testip-on-gemini testip role=Started -inf: gemini
--
のエントリは消えた。

ということは、もう一回 migrate したら…?
$ sudo crm resource migrate testip
$ sudo crm resource show testip
$ sudo crm configure show
ふぅむ。リソースは gemini に戻ってきたが、その代わりに
--
location cli-ban-testip-on-cancer testip role=Started -inf: cancer
--
というエントリが追加されたか…。

もう一度 unmigrate してみよう。
$ sudo crm resource unmigrate testip
$ sudo crm resource show testip
gemini で稼働している状態で変化なし。
$ sudo crm configure show
--
location cli-ban-testip-on-cancer testip role=Started -inf: cancer
--
このエントリは無くなった。

なるほど…。migrate コマンドは、「当該ノードでは動かさないよ」マークを付けるだけの仕様なのか…。
ちょっと試してみよう。
(migrate コマンドではなく、直接 location を入れてみる)
$ sudo crm configure show
$ sudo crm resouce show testip
gemini で動いていることを確認して…
$ sudo crm configure location cli-ban-testip-on-gemini testip role=Started -inf: gemini
$ sudo crm configure show
$ sudo crm resource show testip
ふむ。やっぱり予想通り、testip リソースが cancer に移った。

なるほどねぇ。じゃぁこの状態で unmigrate したら…?
$ sudo crm resource unmigrate testip
$ sudo crm configure show
追加した location エントリは消えた。
$ sudo crm resource show testip
でも cancer で稼働し続けている。

だんだん見えてきた。

それじゃぁ今度は、実際の障害テストだ。
testip リソースを gemini に戻すが、面倒なので停止→起動の手順を踏む。
$ sudo crm resource stop testip
$ sudo crm resource start testip
$ sudo crm resource show testip
$ sudo crm configure show
ヨシ。

障害テストだ。
前回と同様、gemini を載せているホストマシン sagittarius から、gemini を強制的に停止させる。
testip が cancer 側に移ってくるはずだ。
(sagittarius) $ virsh destroy gemini

やはり 10秒ほどで、cancer に移動したようだ。
(cancer) $ sudo crm resource show testip
(cancer) $ sudo crm configure show
っと、「gemini では動かしちゃダメだよ」ルールも追加されていない。
前回と同じ挙動だ。

ここで gemini を復旧させる。
前回は、testip リソースが勝手に gemini に戻ったが、今回は勝手に戻ることは無いはずだ。
(sagittarius) $ virsh start gemini
(gemini) $ sudo crm resource show testip
予想通り、cancer 側には戻ってきていない。
これが前回との差異か。

実際の障害→復旧の流れだと、この時点で gemini の H/W 及び OS の正常性確認を行った後、サービス(リソース)を gemini 側に移動させるのだけど、クラスタ製品によっては、「戻す」というオペレーションではなく、「サービスを停止→起動」というオペレーションになる。
pacemaker だとどうなんだろう?
migrate だと location 制約が出来てしまい、unmigrate だと移動まではしてくれない。
「障害からの復旧」だから、「サービス停止→起動」でいいんだろう。
$ sudo crm resource stop testip
$ sudo crm resource start testip
$ sudo crm resource show testip
$ sudo crm configure show
復旧オペレーションはこれでオシマイかな?

さて最後に「一旦リソースを削除し、新たに作成するやり方」方法を書いておく。
まずは当該リソースを停止
$ sudo crm resource stop testip
$ sudo crm resource show testip
$ sudo crm configure show

続いて、リソースを削除
$ sudo crm configure delete testip_loc
$ sudo crm configure delete testip
$ sudo crm configure show

自動フェイルバックを Off にしてリソースを作成
$ sudo crm configure primitive testip \
  ocf:heartbeat:IPaddr2 \
   params \
    ip="192.168.55.155" \
   meta \
    resource-stickiness="INFINITY"
$ sudo crm configure \
  location testip_loc testip \
    rule 100: \#uname eq gemini \
    rule  50: \#uname eq cancer

結果の確認
$ sudo crm resource show testip
(cancer で起動してしまったので、リソースを再起動)
$ sudo crm resource restart testip
$ sudo crm resource show testip
$ sudo crm configure show

出来た。
これでリソースの自動フェイルバック禁止はOKだ。

リソース定義は他にも色々細かい設定があるようだけど、IPリソースの定義はこのあたりにしておいて、次回は KVMゲストを HA クラスタのリソースとして定義してみようと思う。

0 件のコメント:

コメントを投稿