CentOS6のKVMでストレージライブマイグレーションを行う

Pocket

RHEL6からストレージライブマイグレーションがサポートされたようです。CentOS6.3どうしで行いました。
OpenStackやらAWSなどの巷ではブロックマイグレーションとも言うらしいですね。

ホスト名の定義

  • source.example.com: ライブマイグレーション元となるKVMホストOS
  • dest.example.com: ライブマイグレーション先となるKVMホストOS
  • virtual.example.com: ライブマイグレーションを行う仮想マシン

source#をマイグレーション元、dest#をマイグレーション先とします。

イメージサイズを調べる

source# cd /var/lib/libvirt/images/
source# ls -l | grep virtual
-rw-r--r-- 1 qemu qemu 104857600000  6月 10 18:16 2012 virtual.example.com.img

ターゲットホストに寸分違わぬイメージファイル領域を確保します。
以下の例はext4ファイルシステムを採用している場合に限ります。

dest# cd /var/lib/libvirt/images/
dest# fallocate -l 104857600000 virtual.example.com.img
dest# virsh pool-refresh default ← たぶんいらない
プール default がリフレッシュされました

ext3等の古いファイルシステムを使用している場合は dd コマンドで地道にイメージファイルを作成します。
ブロックサイズを小さくし過ぎるといつまでたっても終わらないのでなるべく大きめにとります。

dest# dd if=/dev/zero of=/var/lib/libvirt/images/virtual.example.com.img bs=10485760 count=10000
dest# virsh pool-refresh default ← たぶんいらない
プール default がリフレッシュされました

iptablesの終了

dest# service iptables stop

ストレージライブマイグレーションの実行

一時的に/etc/hostsファイルに以下の記述を追加します。

source# vi /etc/hosts
...
xxx.xxx.xxx.xxx  dest.example.com

この記述を追加しない場合、以下のようなエラーが出る可能性があります。

エラー: unable to connect to server at 'dest.example.com:49152': Connection refused

ストレージライブマイグレーションを実行します。

source# virsh migrate --live --copy-storage-all --persistent --verbose virtual.example.com qemu+ssh://xxx.xxx.xxx.xxx/system
root@xxx.xxx.xxx.xxx's password: ← rootパスワードをキーイン
...(しばらくかかる)...

オプションの説明をします。

–live
ライブマイグレーションします。
–copy-storage-all
ストレージをすべてまるまるコピーします。
–persistent
転送先に自動的にxml定義ファイルを定義します。特に理由のない限りはこれを指定します。指定しないと仮想マシンを落とした時に立ちあげられなくなります。
–verbose
現在のマイグレーション進捗状況を表示します。ディスクサイズが大きいのでこれがないとどれぐらい進んだのかわからなくて不安になります。

ローカルネットワーク内の転送で10GBのイメージファイルでおよそ5分といったところです。
マイグレーションが完了するとsourceのVMが停止し、自動的にdestのVMが開始されます。

ただし、インターネットを越えて転送すると10GBあたり1時間もかかります。
さらに、安いプロバイダ上でこのような巨大なトラフィックを流すと一瞬で警告のメールが来て最悪の場合には契約が解消されてしまうおそれがあるので、こういったクリティカルな用途には上位のプロバイダを契約されることを強く推奨します。

エラー: Unsafe migration: Migration may load to data corruption if disks use cache != noneと出る場合

  • [VirtIO Disk1]->[Performance options]->[Advanced options]
    • キャッシュモデル: none
    • IO mode: default

に設定の上、再起動してください。

ライブマイグレーション後のXML生成

virsh migrate 時に --persistent オプションをつけていれば以下の操作は必要ありません。
転送先に自動的にxml定義ファイルが作成されます。

ライブマイグレーションしただけだとXMLファイルがdestに配置されません。
何かの拍子にシャットダウンしてしまうと仮想マシンマネージャーのエントリから消滅します。

消滅させてしまった場合はsourceからdestにXMLファイルをコピーしてください。

source# scp /etc/libvirt/qemu/virtual.example.com.xml root@xxx.xxx.xxx.xxx:/etc/libvirt/qemu/
dest# cd /etc/libvirt/qemu/
dest# virsh define virtual.example.com.xml
ドメイン virtual.example.com が virtual.example.com から定義されました

仮想マシンが生きているうちでしたら以下のコマンドでXMLファイルを生成することができます。

dest# cd /etc/libvirt/qemu/
dest# virsh dumpxml virtual.example.com > virtual.example.com.xml
dest# virsh define virtual.example.com.xml
ドメイン virtual.example.com が virtual.example.com から定義されました

参考

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください