めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenStack上の仮想マシンインスタンスの可用性について

OpenStackで、仮想マシンインスタンスが稼働するCompute Nodeが障害停止した際に、仮想マシンインスタンスを復旧する方法/考え方について整理しておきます。(ハイパーバイザーはLinux KVMの前提です。)

仮想ディスクの構成について

まず、前提として、仮想ディスクの構成を理解しておきましょう。ゲストOSが導入された起動ディスクについては、仮想マシンインスタンスを起動する際に、「エフェメラルディスク」、もしくは、「ブロックボリューム」のどちらかが選択可能です。

エフェメラルディスクは、Compute Nodeのローカルディスクに仮想ディスクイメージが配置されるため、Compute Nodeが障害停止するとアクセス不能になります。他のCompute Nodeで再利用することはできません。

ブロックボリュームは、Cinderが提供するディスク領域で、一般的には、外部のストレージ装置を使用するため、Compute Nodeが障害停止しても、ディスクの内容はストレージ装置上に残ります。他のCompute Nodeから再利用することが可能です。

また、起動ディスクの他に、ユーザーデータを保存するための追加のディスク領域をブロックボリュームとして接続することも可能です。

Compute Node障害時に仮想マシンインスタンスを手動復旧する方法

仮想マシンインスタンスのディスク構成に応じて、考え方が変わります。

(1) エフェメラルディスクのみ

ゲストOSとユーザーデータをまとめて、1つのエフェメラルディスクに保存します。Compute Nodeが障害停止するとユーザーデータが失われることになりますので、ユーザーデータを含めて、手動復旧する方法はありません。データを失っても困らない、検証環境などで利用してください。

停止した仮想マシンインスタンスに対して、nova evacuateコマンドを実行すると、同一構成の仮想マシンインスタンスを他のCompute Nodeで起動しなおす事が可能です。最初に仮想マシンインスタンスを起動した時と同じ、初期状態に復旧する形になります。

(2)エフェメラルディスク+ブロックボリューム

ゲストOSはエフェメラルディスクを使用して、ユーザーデータは追加のブロックボリュームに保存します。Compute Nodeが停止した場合、ゲストOS領域は失われますが、ユーザーデータは保護されます。同じゲストOS構成の仮想マシンインスタンスを他のCompute Nodeで起動して、ブロックボリュームを再接続することでサービスを再開することができます。(仮想マシンインスタンス起動後にゲストOSの内容を変更していた場合は、それらの変更は失われます。)

この処理は、停止した仮想マシンインスタンスに対して、nova evacuateコマンドを実行することで、自動的に行われます。

(3)ブロックボリュームのみ

ゲストOSとユーザーデータをまとめて、1つのブロックボリュームに保存するか、もしくは、ゲストOSとユーザーデータのそれぞれに独立したブロックボリュームを割り当てます。Compute Nodeが障害停止した場合、ゲストOS、ユーザーデータともに保護されます。同じブロックボリュームを使って、他のCompute Nodeで仮想マシンインスタンスを起動することで、サービスを再開することができます。

この処理は、停止した仮想マシンインスタンスに対して、nova evacuateコマンドを実行することで、自動的に行われます。

Compute Node障害時に仮想マシンインスタンスを自動復旧する方法

OpenStackでは、Compute Nodeの障害を検知して、自動的に仮想マシンインスタンスを起動し直す仕組みは提供されていません。必要な場合は、次の処理をおこなうプログラム/スクリプトを外部で実行しておくことで、この処理を自動化することが可能です。

・保護対象の仮想マシンインスタンスの状態をチェックする。
・仮想マシンインスタンスの状態が異常になった場合、それが稼働するCompute Nodeの状態をチェックして、異常原因がCompute Nodeの障害停止であることを確認する。
・その場合は、対象の仮想マシンインスタンスに対して、nova evacuateコマンドを実行する。

仮想マシンインスタンスのLive Migrationについて

ゲストOSを稼働したまま仮想マシンインスタンスを他のCompute Nodeに移動するLive Migrationについても、仮想ディスクの構成によって動作が変わります。ブロックボリュームから仮想マシンインスタンスを起動している場合は、通常通りのLive Migrationが実施できます。

一方、エフェメラルディスクから起動している場合は、Compute Nodeのローカルディスク領域の間で、仮想ディスクイメージの内容を複製する処理が入ります。一般にブロックマイグレーションと呼ばれる動作です。エフェメラルディスクに高頻度の書き込みが発生している環境では、Live Migrationの処理が完了するまで長時間かかったり、場合によっては、時間がかかりすぎて処理がタイムアウトする恐れもあります。本番環境での利用は、あまりおすすめできません。

この他に、Compute Nodeのローカルディスク上にNFS領域をマウントして、エフェメラルディスクのイメージファイルを複数のCompute Nodeで共有する構成にしておけば、エフェメラルディスクでも通常のLive Migrationが可能になります。