異なるホスト間で仮想マシンを移動(マイグレーション)する方法は,大きく分けて2種類ある。コールド・マイグレーションとホット・マイグレーションだ。端的に表現するならば,前者は電源OFFの状態の仮想マシンを,後者は電源ONの状態の仮想マシンを移動する方法である。VMwareはホット・マイグレーションのことを「VMotion」と呼んでいる。「あるホストで実行中の仮想マシンを,稼働させたまま別のホストに移動する」という大変便利なこの機能は,VMware製品の中ではVMware ESX Serverのみが備えている。

 ここでは,まずVMotionの仕組みを解説し,次に,実際のシステム運用を想定したVMotionの活用方法について,実行手順といくつかのケースを提示していく。

仮想マシンの全情報をコピー

 最初にVMotionの大まかな流れをおさえておこう。VMotionは,以下に示す3ステップを踏む。

(1)VMotionが要求されると,VirtualCenterは対象の仮想マシンが,現在のホスト上で正しく機能していることを確認する。

(2)対象となる仮想マシンの状態情報を移動先ホストにコピーする。仮想マシンの状態情報には,ネットワーク接続情報を含む全メモリー情報と,レジスタなどプロセッサにかかわる全情報が含まれる。

(3)移動先ホストで,対象となる仮想マシンの活動を再開させる。

 仮想マシンのすべての情報は,共有ディスク(SAN,iSCSI,NFSのいずれか)に保存されている。共有ディスクにはVMware独自のVMFSというクラスタ・ファイル・システムが利用され,各ホスト間でロック管理することにより,VMotionを実現している。また,VMotionには,専用のギガビット・イーサネットが必要である。

 なお,VMotion中にエラーが発生した場合は,仮想マシンはVMotionの実行前の状態に戻される。

メモリー情報をすべて送信

 上述の3ステップのうち,最も興味が持たれるであろう(2)と(3)について,もう少し詳しく説明する。図1では,「ESX01」と「ESX02」の2台のホストがあり,現在ESX02上で仮想マシン「TestSrv」が稼働している。そしてクライアントPCから,TestSrvにアクセスしているものとする。

図1●VMotionの実行で発生するイベント
図1●VMotionの実行で発生するイベント
[画像のクリックで拡大表示]

 この状況でTestSrvをESX01にVMotionさせると,VMware ESX Serverの内部ではどのようなイベントが発生するのだろうか。図1の(1)から(3)まで順を追って見ていこう。

(1)ESX02で,仮想マシンTestSrvに割り当てられたメモリーのスナップ・ショットが取られ,NIC2を介してESX01に送信される。例えば,TestSrvに512Mバイトのメモリーを割り当てていたならば,512Mバイト分のデータがネットワークを経由して送信される。この後,ESX01ではメモリー・スナップ・ショットとTestSrv用の仮想ディスクを使って,TestSrvを活動させるための準備を開始する。

(2)メモリーのスナップ・ショットを送信した後も,ESX02上で稼働しているTestSrvはクライアントPCからの要求に応じ続けている。スナップ・ショット送信後に変更されたTestSrvのメモリーの差分情報を含む仮想マシンの状態情報が,ESX02からESX01にNIC2を介して送信される。ESX01では,(1)の時点で準備したTestSrvに,その後ESX02から送られてきた仮想マシン状態情報を加えて,TestSrvの最新状態を作り出す。ESX01上のTestSrvが最新状態になったら,ESX02は自身で稼働しているTestSrvの活動を停止させ,ESX01は自身の上のTestSrvの活動を開始する。

 参考までに,VMotion実行時にVMotion専用ネットワークで発生するESX02側のトラフィックを計測した例を図2に示す。もちろんこの場合,ESX01側のVMotionにかかわるデータ受信量は,ほぼ同じ波形になる。十数秒にわたって500Mビット/秒程度のトラフィックが発生していることからも,VMotion用のネットワークは,専用のギガビット・イーサネットが要求されることが理解できる。

図2●VMotion専用ネットワークで発生するトラフィックを計測した例
図2●VMotion専用ネットワークで発生するトラフィックを計測した例

(3)ESX01はNIC1を介して,送信元と送信先が共にTestSrvのMACアドレスとなっているRARP(Reverse Address Resolution Protocol)パケットをネットワーク上に送信する。これにより,ESX01のNIC1がつながっているネットワーク・スイッチに対して,TestSrvのMACアドレス・テーブルを更新するよう促され,TestSrvのMACアドレスをあて先とするパケットは,ESX01のNIC1に向かうようになる。