Fedora12でfence-virtを使ってみた
RHCSを使う際には、フェイルオーバーを試すときに、Fence Deviceが必要になる。これまで、XenのノードのFencingにはfence_xvmなどが使用できたのだが、KVMのFencingとしては、SSH経由でVMの停止を行うfence_virshぐらいしかツールがなく、SSHのrootアクセスを許可しなくてはいけないため、敷居が高かった。
最近のFedoraでは、新たにfence-virt( http://sources.redhat.com/cluster/wiki/FenceVirt )が導入され、SSHの設定変更無しでもKVMのfencingが出来るようになっていたので、使ってみた。
詳しい使い方については、こちらを参照。
http://www.clusterlabs.org/wiki/Guest_Fencing
fence-virtでは、複数ノードでのVM管理(別ノードで動作するVMのFencing)などの機能もあるようなのだが、今回試したのは、単一ノードでのFencing(backend: libvirt, listener: multicast)と、同じく単一ノードなのだが、バックエンドとして、Apache Qpidを使用した設定(backend: libvirt-qpid, listener: multicast)の2つとなる。
単一ノードの場合
インストールは、ホストOSについては次のコマンドで行う。
# yum install fence-virt fence-virtd fence-virtd-libvirt fence-virtd-multicast fence-virtd-libvirt-qpid
(後で必要になるライブラリもまとめて導入している。。)
ゲストについては、fence-virtだけで動作する。
# yum install fence-virt
リンク先の手順と同様、次のコマンドで設定ファイルを作成する。
# fence_virtd -c
設定として、InterfaceにはFenceを行いたいVMが接続されているブリッジを選ぶのと、Backendとして"libvirt"を設定する(デフォルトは"checkpoint")ことだけ注意する。
この状態で、ホストOSの/etc/cluster/fence_xvm.keyに、鍵を作成しておく。(なお、fence-virtがfence_xvmと互換性を保つように作られているため、鍵の置き場所はfence_xvmと同じになる。)
# dd if=/dev/random bs=512 count=1 /etc/cluster/fence_xvm.key
ここで、fence-virtサービスの起動を行う。
# service fence_virtd start
この状態で、ホストOS上で次のコマンドを打つと、稼働しているVMの状態が列挙されるはずである。
# fence_xvm -o list fedora-virt4 2749218e-13e8-99cd-367b-e069d45fd54d on fedora-virt5 718d26ac-e812-30c1-ec73-736009d28e91 on fedora-virt6 e91ee0fe-260a-6358-bba2-85fbd2b6b4fc on fedora-virt7 4840fa19-93a6-42c2-9b76-61ce94aff2ae on
ちなみに状態を取得するには、"status"コマンドをつかうとよいらしい。
# fence_xvm -H fedora-virt8 -o status; echo $? 2 <== 動いていないVMの場合 # fence_xvm -H fedora-virt7 -o status; echo $? 0 <== 動いているVMの場合
例えば、fedora-virt8 をFenceする場合には、次を実行すると、VMがdestroyされる。
# fence_xvm -H fedora-virt8 -o off
ゲストOSから同様のコマンドを実施するには、fence_xvm.keyをゲストOSの/etc/clusterにコピーし、同じコマンドを実施する。
# fence_xvm -o list # fence_xvm -H fedora-virt6 -o off
qpidを使用する場合
qpidを使う場合、各ホストOSからqpidに通信を行い、どのノードにどのVMが存在するかの情報を管理しておく。このため、VM不具合などでFenceの指示が出された時には、qpid経由で、VMを動かしているノードに指示が行き、対象ノードのホストOSがFencingを行うわけである。
fence-virtをqpid経由で使用するには、まず適当なノードでqpidを起動する。ここではホストOSを使用した。(fence先のVMでも起動してみたのだが、上手く動作しなかった。。orz)
まず、/etc/fence_virt.confで、backendをlibvirtからlibvirt-qpidに変更する。
3c3 < backend = "libvirt";
-
- -
-
- -
その後、稼働に必要な各サービスを起動する。
# service qpidd start # service libvirt-qpid start # service fence_virtd start
これで、後は先ほどと同様に動作するはずである。(上手くいかない場合には、qpiddのデバッグログが参考になるかもしれない。。orz)
# fence_xvm -o list # fence_xvm -H fedora-virt7 -o status
一通りfence-virtの使い方を書いてみた。fencingはPacemakerやRHCSなどと組み合わせて使うのが普通だが、それらについてはまだ試していないので、順次実施していこうと思う。。orz