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などのフェンシングデバイスを備えた実行中の高可用性クラスタ。
クラスタノード間でのパスワード不要な
root
SSHログイン。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_ID
crm configure
を実行してcrm
インタラクティブシェルを起動します。DLMのプリミティブリソースを作成します。
crm(live)configure#
primitive dlm ocf:pacemaker:controld \ op monitor interval=60 timeout=60
OCFS2ボリュームのプリミティブリソースを作成します。
crm(live)configure#
primitive ocfs2 Filesystem \ params device="/dev/disk/by-id/DEVICE_ID" directory="/mnt/shared" fstype=ocfs2 \ op monitor interval=20 timeout=40
DLMおよびOCFS2リソースのグループを作成します。
crm(live)configure#
group g-virt-lock dlm ocfs2
グループのクローンを作成して、すべてのノードで実行できるようにします。
crm(live)configure#
clone cl-virt-lock g-virt-lock \ meta interleave=true
show
で変更内容をレビューします。すべて正しければ、
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.xml
XMLファイルに、共有されていないローカルパスへの参照が含まれていないことを確認してください。
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-lock
cl-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
上で起動したことを示します。