Pacemaker/Heartbeat で Master/Slave の migration

PacemakerでDRBDのようなマスタ/スレーブ型のリソースを管理しているときに、マスターをコマンドラインから手動で切り替える方法。*1


例えば次のようにリソースが定義されている場合(primitiveは省略)

group group_master \
  fs vip mysql apache

ms ms_drbd drbd \
  meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" \
  notify="true" target-role="Master"

colocation colocation-group_master-ms_drbd \
  inf: group_master ms_drbd:Master

order order-ms_drbd-group_master \
  inf: ms_drbd:promote group_master:start


次のようにコマンドを実行すると、マスターとスレーブが切り替わります(マスターが現在の位置から別の位置に移動します)。*2

crm_resource -r group_master -M


このコマンドで実際に何が行われるのかというと・・・次のような制約が追加されていました(server1 は元マスターのホスト名)。

location cli-standby-group_master group_master \
        rule $id="cli-standby-rule-group_master" -inf: #uname eq server1

このままだと server1 で group_master が永遠に開始しなくなるため、障害が発生しても server1 へのフェイルオーバが行われません。なので、マスターの切り替えが完了した後に、次のコマンドを実行してこの制約を解除する必要があります。*3

crm_resource -r group_master -U


新しくマスターになるサーバを明示的に指定出来ないことと、切り替え完了後にもコマンドを実行する必要があるのが少し使いづらいですね・・・

*1:heartbeat v1 の頃なら hb_takeover とか hb_standby で簡単切り替えられました。

*2:crm_resource の -N で移動先のホストを指定しても切り替わりませんでした・・・colocationと相殺されるから?

*3:切り替えが完了ししていないタイミングで実行すると、元のサーバ(server1)がマスターのままになってしまうことがあります。