こんにちは!SRE兼クラウドアーキテクトの私です。日夜、雲の上の巨大なインフラストラクチャや、Kubernetesの海原を泳ぐパケットたちと格闘しています。
インフラの世界へ足を踏み入れたばかりの頃、「仮想マシンのライブマイグレーション(無停止移行)」という言葉を初めて聞いたとき、私は魔法か何かだと思いました。動いているサーバーの電源を切らずに、別の物理マシンの上に「よいしょ」と引っ越してしまうなんて、信じられますか?
今回は、そんなライブマイグレーションの裏側を支える「ストレージ共有型」と「無共有型(ストレージマイグレーション)」の違いについて、パケットたちがネットワークを駆け巡るリアルな挙動を交えながら、身近な例え話と一緒に解き明かしていきたいと思います。
難しい用語が出てきても、一歩ずつ理解していきましょう!
—
1. 引越しに例えてみる「共有ストレージ型」と「無共有型」
仮想マシン(VM)のライブマイグレーションを理解するうえで一番わかりやすいのは、私たちの「お引越し」のシチュエーションです。
共有ストレージ型(Shared Storage Migration)
想像してみてください。あなたは今、大きな荷物の入った「トランクルーム(共有ストレージ)」を街の中心に借りて、そのトランクルームの鍵だけを持って、A町の家からB町の家へ引っ越すとします。
家の中にあるのは、あなたの洋服や今日の朝食の食べかけ(メモリ上のデータ)くらいです。タンスや冷蔵庫などの重い家具(ディスク上のデータ)はすべてトランクルームに置きっぱなしなので、引っ越すときは「鍵(参照権)」だけを持って新しい家に移動し、新しい家のリビングからそのトランクルームにアクセスし直せば、すぐに生活を再開できますよね。
これが、NFSやSANなどの共有ストレージ型ライブマイグレーションです。移動するのはVMの「メモリ上の状態」と「CPUのレジスタ情報」だけなので、ネットワークを流れるデータ量も少なく、一瞬で引っ越しが完了します。
無共有型(Storage Migration / Shared-Nothing)
では、トランクルームが使えない場合はどうでしょう? タンスや冷蔵庫もすべて抱えて、A町の古い家から、まっさらなB町の新しい家へ移動しなければなりません。
この場合、トラックをチャーターして重い家具をすべて新しい家に運び終えるまで、引っ越しは終わりませんよね。しかも、荷物を運んでいる最中も、あなたは古い家でテレビを見たり(VMが稼働し続けたり)しています。
これが、無共有型(ディスクイメージも含めてネットワーク転送する方式)です。VMを動かしながら、ディスクのデータ(GBやTB単位の巨大なファイル)をネットワーク経由でコピーし続ける必要があるため、ネットワークには激しい負荷がかかります。
—
2. ネットワークの裏側では何が起きているのか?
それでは、この2つの方式の裏側で、パケットやネットワークはどのように働いているのでしょうか? 少しだけ技術の解像度を上げてみましょう。
共有ストレージ型:メモリのバトンタッチ
共有ストレージ環境(例えば、VMwareのvSphere vMotionや、KVM/OpenStackの環境など)では、ディスクは最初から全ホストから見える状態(NFSやiSCSIなど)になっています。
1. 初期同期: 移行先(Destination)のハイパーバイザーが、移行元(Source)と同じ仮想マシンの器(設定ファイル等)を用意します。
2. メモリの反復コピー(Pre-copy): VMが動きながら書き換えているメモリの差分を、移行元から移行先へ何度もせっせと送り続けます。
3. 瞬間停止と切り替え(Stun & Switch): 差分が十分に小さくなったコンマ数秒の間だけVMをミリ秒単位で一時停止させ、最終的なCPU状態と最後のメモリ差分をパケットに乗せて送り、スイッチをパチンと切り替えます。
4. 再開: 新しいホスト上でVMが何事もなかったかのように動き始めます。ディスクは最初から同じ場所を向いているため、再マウントの必要もありません。
無共有型:NBD(Network Block Device)によるディスクの二重奏
無共有型では、メモリだけでなくディスクそのものをネットワーク越しにコピーしなくてはなりません。ここで大活躍するのが、NBD(Network Block Device)などのプロトコルです。
1. ディスクのストリーミング転送: 移行先のホストへ、空っぽのディスクイメージを作成しつつ、移行元からバックグラウンドでブロック単位のデータを流し込みます(初期同期)。
2. 書き込みの同期(Mirroring): このコピーの最中も、元のVMは元気に動いています。「あ、ここに新しいデータを書き込んで!」というリクエストが来たら、移行元はそのデータを自分のディスクに書きつつ、ネットワーク経由で移行先のディスクにも同じデータを書き込みます(ミラーリング)。
3. 最終同期と切り替え: ディスク全体のコピーが100%完了したら、メモリの最終差分を同期し、移行元から移行先へ主役をバトンタッチします。
—
3. 実務で役立つ設定とコマンドの雰囲気を感じよう
現場のSREやインフラエンジニアとして、このライブマイグレーションを安全に実行するためには、ネットワークの帯域制御(QoS)やタイムアウトの設定が非常に重要になります。
例えば、KVMベースの仮想化環境(QEMU/KVM)でライブマイグレーションを行う際、管理用CLIから次のようなパラメーターを調整することがあります。
# マイグレーション時に使用する最大帯域幅を制限する設定例(QEMU Monitor経由)
# 巨大なディスクやメモリを持つVMがネットワーク帯域を枯渇させないように絞る
migrate_set_capability downtime-limit value 300
migrate_set_speed 2G
# 実際にマイグレーションを開始するコマンドの例
# tcpプロトコルを用いて、移行先ホストのポートへメモリと状態をストリーミングする
migrate -d tcp:192.168.100.50:49152
> 現場の知恵袋:
> 無共有型マイグレーションを行う際、ディスクの転送量がネットワークの帯域(例: 1Gbpsや10Gbps)を完全に埋め尽くしてしまうことがあります。もし本番環境でこれをやってしまうと、同じネットワークを通っている他のアプリケーションのパケットが押し出され、大障害に発展することも……!
> だからこそ、必ずマイグレーション専用の独立した物理ネットワーク(Migration Network)を用意するか、上記のように帯域幅のキャップ(上限)を設けるのがプロの技となります。
—
4. おわりに
いかがでしたでしょうか?
- 共有ストレージ型は、「トランクルームの鍵だけ持って身軽に引っ越すスマートな方式」。
- 無共有型は、「住みながら大荷物をトラックに積んで走り続けるアクロバティックな方式」。
どちらの方式も、裏側では「いかにユーザーに気づかれないようにデータを同期し、瞬間的な停止時間を最小限にするか」というエンジニアたちの知恵と工夫が詰まっています。
インフラやネットワークの学び始めは、目に見えないパケットの動きを想像するのが難しいかもしれませんが、「現実世界の引越し」に置き換えてみると、途端に親しみやすく、愛おしく感じられてきませんか?
それでは、また次回のクラウド・ネットワークの旅でお会いしましょう。良きインフラライフを!
コメント