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";
    • -
> backend = "libvirt-qpid"; 19c19 < libvirt {
    • -
> libvirt-qpid {

その後、稼働に必要な各サービスを起動する。

# 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