18 仮想化のための高可用性 #
この章では、仮想マシンを可用性の高いクラスタリソースとして設定する方法を説明します。
18.1 概要 #
仮想マシンは、高可用性クラスタでさまざまな役割を担うことができます。
仮想マシンは、クラスタによってリソースとして管理できますが、クラスタは仮想マシン上で実行されるサービスを管理できません。この場合、VMはクラスタに対して不透明です。これがこのドキュメントで説明するシナリオです。
仮想マシンはクラスタリソースになることができ、
pacemaker_remoteを実行できます。これにより、クラスタは仮想マシン上で実行されるサービスを管理できます。この場合、VMはゲストノードであり、クラスタに対して透過的です。このシナリオについては、Section 4, “Use case 2: setting up a cluster with guest nodes”を参照してください。仮想マシンは完全なクラスタスタックを実行できます。この場合、VMは通常のクラスタノードであり、クラスタによってリソースとして管理されません。このシナリオについては、インストールとセットアップクイックスタートを参照してください。
以下の手順では、ブロックストレージ上に可用性の高い仮想マシンをセットアップする方法について説明します。ここでは、VMのロックファイルやXML設定ファイルを保存するために、別のブロックデバイスをOCFS2ボリュームとして使用します。この仮想マシンおよびOCFS2ボリュームは、クラスタによって管理されるリソースとして設定されます。ただし、仮想マシンが任意のノードで起動する前にロックファイルディレクトリが常に使用できるようにするためにリソース制約を設けます。これにより、仮想マシンが複数のノードで起動するのを防ぐことができます。
18.2 要件 #
2つ以上のノードとSBDなどのフェンシングデバイスを備えた実行中の高可用性クラスタ。
クラスタノード間でのパスワード不要な
rootSSHログイン。VMのインストールおよび実行に使用される、各クラスタノード上のネットワークブリッジ。これは、クラスタ通信および管理に使用されるネットワークとは別のものでなければなりません。
2つ以上の共有ストレージデバイス(または単一の共有デバイス上のパーティション)。これにより、すべてのクラスタノードがVMに必要なファイルとストレージにアクセスできます。
OCFS2ボリュームとして使用するデバイス。これに、VMのロックファイルとXML設定ファイルを保存します。OCFS2ボリュームの作成およびマウントについては、次の手順で説明します。
VMのインストールソース(ISOファイルやディスクイメージなど)を含むデバイス。
インストールソースによっては、VMのストレージディスク用に別のデバイスが必要になる場合があります。
I/Oの枯渇を避けるため、これらのデバイスはSBDに使用される共有デバイスとは別にする必要があります。
すべてのストレージパスの固定デバイス名(例:
/dev/disk/by-id/DEVICE_ID)。共有ストレージデバイスの/dev/sdX名が、異なるノードで不一致になると、VMの移行が失敗する原因となることがあります。
18.3 ロックファイルを管理するようにクラスタリソースを設定する #
この手順に従ってクラスタを設定し、仮想マシンのロックファイルを管理します。VMが実行されているノードに関係なく、クラスタがロックファイルを認識できるように、ロックファイルのディレクトリはすべてのノードで使用可能である必要があります。
クラスタノードのいずれかで次のコマンドを実行するだけで済みます。
共有ストレージデバイスのいずれかにOCFS2ボリュームを作成します。
#mkfs.ocfs2 /dev/disk/by-id/DEVICE_IDcrm configureを実行してcrmインタラクティブシェルを起動します。DLMのプリミティブリソースを作成します。
crm(live)configure#primitive dlm ocf:pacemaker:controld \ op monitor interval=60 timeout=60OCFS2ボリュームのプリミティブリソースを作成します。
crm(live)configure#primitive ocfs2 Filesystem \ params device="/dev/disk/by-id/DEVICE_ID" directory="/mnt/shared" fstype=ocfs2 \ op monitor interval=20 timeout=40DLMおよびOCFS2リソースのグループを作成します。
crm(live)configure#group g-virt-lock dlm ocfs2グループのクローンを作成して、すべてのノードで実行できるようにします。
crm(live)configure#clone cl-virt-lock g-virt-lock \ meta interleave=trueshowで変更内容をレビューします。すべて正しければ、
commitで変更を送信し、quitでcrmライブ設定を終了します。グループクローンの状態を確認します。すべてのノードで実行されている必要があります。
#crm status[...] Full List of Resources: [...] * Clone Set: cl-virt-lock [g-virt-lock]: * Started: [ alice bob ]
18.4 仮想マシンをホストするようにクラスタノードを準備する #
この手順に従って、必要な仮想化サービスのインストールと起動を行い、VMのロックファイルを共有OCFS2ボリュームに保存するようにノードを設定します。
この手順では、crm cluster runを使用してすべてのノードで同時にコマンドを実行します。個々のノードを個別に管理したい場合、コマンドのcrm cluster runの部分を省略できます。
クラスタのすべてのノードに仮想化パッケージをインストールします。
#crm cluster run "zypper install -y -t pattern kvm_server kvm_tools"1つのノードで、ファイル
/etc/libvirt/qemu.conf内にあるlock_manager設定を見つけて有効にします。lock_manager = "lockd"
同じノードで、ファイル
/etc/libvirt/qemu-lockd.conf内にあるfile_lockspace_dir設定を見つけて有効にし、OCFS2ボリューム上のディレクトリを指すように値を変更します。file_lockspace_dir = "/mnt/shared/lockd"
これらのファイルをクラスタ内の他のノードにコピーします。
#crm cluster copy /etc/libvirt/qemu.conf#crm cluster copy /etc/libvirt/qemu-lockd.confクラスタ内のすべてのノードで
libvirtdサービスを有効にし、開始します。#crm cluster run "systemctl enable --now libvirtd"これにより
virtlockdサービスも開始されます。
18.5 クラスタリソースとして仮想マシンを追加する #
この手順に従って、仮想マシンをクラスタリソースとしてクラスタに追加します。ただし、VMがロックファイルにいつでもアクセスできるようにリソース制約を設けます。ロックファイルはg-virt-lockグループのリソースによって管理されます。このグループはcl-virt-lockクローンを介してすべてのノードで使用できます。
クラスタノードのいずれかに仮想マシンをインストールします。ただし、次の制約があります。
インストールソースとストレージを共有デバイス上に配置すること。
ホストブート時にVMを起動するように設定してはならない。
詳細については、 Virtualization Guide for SUSE Linux Enterprise Serverを参照してください。
仮想マシンが実行中の場合、シャットダウンします。VMをリソースとして追加すると、クラスタがVMを起動します。
XML設定をOCFS2ボリュームにダンプします。各VMについて、このステップを繰り返します。
#virsh dumpxml VM1 > /mnt/shared/VM1.xmlXMLファイルに、共有されていないローカルパスへの参照が含まれていないことを確認してください。
crm configureを実行してcrmインタラクティブシェルを起動します。プリミティブリソースを作成し、仮想マシンを管理します。各VMについて、このステップを繰り返します。
crm(live)configure#primitive VM1 VirtualDomain \ params config="/mnt/shared/VM1.xml" remoteuri="qemu+ssh://%n/system" \ meta allow-migrate=true \ op monitor timeout=30s interval=10sオプション
allow-migrate=trueを指定すると、ライブマイグレーションが有効になります。値をfalseに設定すると、クラスタは、あるノードでVMをシャットダウンし別のノードで再起動することによって、VMを移行します。負荷の影響に基づいてVMを配置できるように使用属性を設定する必要がある場合は、7.10項 「負荷インパクトに基づくリソースの配置」を参照してください。
cl-virt-lockが実行中のノードでのみ仮想マシンを起動できるように、コロケーション制約を作成します。crm(live)configure#colocation col-fs-virt inf: ( VM1 VM2 VMX ) cl-virt-lockcl-virt-lockが常に仮想マシンの前に開始されるように、順序制約を作成します。crm(live)configure#order o-fs-virt Mandatory: cl-virt-lock ( VM1 VM2 VMX )showで変更内容をレビューします。すべて正しければ、
commitで変更を送信し、quitでcrmライブ設定を終了します。仮想マシンの状態を確認します。
#crm status[...] Full List of Resources: [...] * Clone Set: cl-virt-lock [g-virt-lock]: * Started: [ alice bob ] * VM1 (ocf::heartbeat:VirtualDomain): Started alice * VM2 (ocf::heartbeat:VirtualDomain): Started alice * VMX (ocf::heartbeat:VirtualDomain): Started alice
仮想マシンは、高可用性クラスタによって管理されるようになり、クラスタノード間で移行できるようになりました。
仮想マシンをクラスタリソースとして追加した後、仮想マシンを手動で管理しないでください。第8章 「クラスタリソースの管理」で説明されているクラスタツールのみを使用してください。
クラスタが管理するVMの保守タスクを実行するには、28.2項 「保守タスクのためのさまざまなオプション」を参照してください。
18.6 セットアップをテストする #
以下の各テストを実施して、仮想マシンの高可用性セットアップが予想どおりに動作することを確認します。
これらのテストは、運用環境ではなくテスト環境で実行してください。
仮想マシン
VM1がノードalice上で実行されています。ノード
bobで、virsh start VM1を使用してVMを手動で起動してみます。予想される結果:
virshコマンドが失敗します。VM1がalice上で実行されている場合、これをbob上で手動で起動することはできません。
仮想マシン
VM1がノードalice上で実行されています。2つの端末を開きます。
1つ目の端末で、SSH経由で
VM1に接続します。2つ目の端末で、
crm resource move VM1 bobを使用してVM1をノードbobに移行してみます。crm_mon -rを実行し、安定するまでクラスタの状態を監視します。これには少し時間がかかる場合があります。1つ目の端末で、
VM1へのSSH接続がアクティブのままかどうか確認します。予想される結果: クラスタの状態が、
VM1がbob上で起動したことを示します。VM1へのSSH接続が、移行中ずっとアクティブなままです。
仮想マシン
VM1がノードbob上で実行されています。bobを再起動します。ノード
aliceで、crm_mon -rを実行し、安定するまでクラスタの状態を監視します。これには少し時間がかかる場合があります。予想される結果: クラスタの状態が、
VM1がalice上で起動したことを示します。
仮想マシン
VM1がノードalice上で実行されています。マシンを強制的にオフにするかまたは電源ケーブルを抜くことで、
aliceのクラッシュをシミュレートします。ノード
bobで、crm_mon -rを実行し、安定するまでクラスタの状態を監視します。ノードがクラッシュした後のVMのフェールオーバーは通常、ノードを再起動した後のVMの移行よりも時間がかかります。予想される結果: しばらくすると、クラスタの状態が、
VM1がbob上で起動したことを示します。