Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

15.5. virsh での KVM のライブマイグレーション

ゲスト仮想マシンは、virsh コマンドを使用して、別のホストの物理マシンに移行することができます。migrate コマンドは、以下の形式のパラメーターを受け入れます。
# virsh migrate --live GuestName DestinationURL
ライブマイグレーションが必要ない場合には、--live オプションが削除される可能性があることに注意してください。「virsh migrate コマンドの追加オプション」
GuestName パラメーターは、移行するゲスト仮想マシンの名前を表します。
DestinationURL パラメーターは、移行先ホストの物理マシンの接続 URL です。宛先システムは、同じバージョンの Red Hat Enterprise Linux を実行し、libvirt が実行中である必要がある。
注記
通常の移行および peer2peer 移行用の DestinationURL パラメーターには、さまざまなセマンティクスがあります。
  • 通常の移行: DestinationURL は、ソースゲスト仮想マシンに表示されるターゲットホスト物理マシンの URL です。
  • ピア2peer 移行: DestinationURL は、ソースホストの物理マシンに表示される、ターゲットホスト物理マシンの URL です。
コマンドを実行すると、宛先システムの root パスワードの入力が求められます。
重要
移行を成功させるには、名前解決が両側(ソースと宛先)で機能する必要があります。両側は他を検索できる必要があります。相互に ping して、名前解決が機能していることを確認します。

例: virsh でのライブマイグレーション

この例では、host1.example.com から host2.example.com に移行します。お使いの環境のホストの物理マシン名を変更します。この例では、guest1-rhel6-64 という名前の仮想マシンを移行します。

この例では、共有ストレージを完全に設定し、すべての前提条件を満たしていることを前提としています 移行の要件)。
  1. ゲスト仮想マシンが実行していることを確認します。

    ソースシステムから host1.example.com で、guest1-rhel6-64 が実行していることを確認します。
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
  2. ゲスト仮想マシンの移行

    以下のコマンドを実行して、ゲスト仮想マシンを宛先 host2.example.com にライブマイグレーションします。libvirt の完全なアクセスが必要であることを伝えるために、宛先 URL の最後に /system を追加します。
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    コマンドを実行すると、宛先システムの root パスワードの入力が求められます。
  3. wait

    ゲスト仮想マシンのサイズによっては、移行に時間がかかる場合があります。virsh はエラーを報告します。ゲスト仮想マシンは、完全に移行されるまで移行元ホストの物理マシンで稼働し続けます。
  4. ゲスト仮想マシンが移行先ホストに到達したことを確認します。

    宛先システムの host2.example.com から guest1-rhel7-64 が実行されていることを確認します。
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
    
ライブマイグレーションが完了しました。
注記
libvirt は、TLS/SSL、UNIX ソケット、SSH、暗号化されていない TCP などのさまざまなネットワーキング方法に対応します。他の方法の使用方法は 18章ゲストのリモート管理
注記
実行中の仮想マシンは、以下のコマンドで移行することができます。
# virsh migrate --offline --persistent 

15.5.1. virsh での移行に関する追加のヒント

各移行が別のコマンドシェルで実行される複数の同時ライブマイグレーションを実行できます。ただし、これは注意して実行する必要があり、各移行インスタンスはそれぞれの MAX_CLIENT(ソースおよびターゲット)を使用するため、注意して計算する必要があります。デフォルト設定が 20 の場合、設定を変更せずにインスタンスを 10 台実行するだけで十分です。手順15.1「libvirtd.conf の設定」
  1. の説明に従って、libvirtd.conf 手順15.1「libvirtd.conf の設定」
  2. Processing controls セクションを確認します。
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
    
  3. max_clients および max_workers パラメーター設定を変更します。数値は両方のパラメーターで同じである必要があります。max_clients は移行ごとに 2 つのクライアントを使用し、max_workers は実行フェーズに 1 つのワーカーを使用し、実行フェーズ中に宛先に 0 ワーカー、終了フェーズ中に 1 つのワーカーを使用します。
    重要
    max_clients および max_workers パラメーターの設定は、libvirtd サービスへのすべてのゲスト仮想マシン接続の影響を受けます。つまり、同じゲスト仮想マシンを使用しているユーザーであれば、同時に移行が行われているユーザーは max_clients および max_workers パラメーター設定に設定された制限も明確になります。このため、同時ライブマイグレーションを実行する前に、最大値を慎重に検討する必要があります。
    重要
    max_clients パラメーターは、libvirt に接続可能なクライアントの数を制御します。多数のコンテナーを一度に起動すると、この制限から簡単に到達して超過できます。これを回避するために max_clients パラメーターの値が増える可能性がありますが、これにより、インスタンスに対するサービス拒否(DoS)攻撃に対して脆弱となる可能性があります。この問題を軽減するために、Red Hat Enterprise Linux 7.0 に新しい max_anonymous_clients 設定が導入されました。この構成は、受け入れられても認証された接続の制限を指定するものです。max_clientsmax_anonymous_clients の組み合わせを実装して、ワークロードに応じて実装できます。
  4. ファイルを保存して、サービスを再起動します。
    注記
    起動した ssh セッションが多すぎるが、まだ認証されていないため、移行接続がドロップされる場合もあります。デフォルトでは、sshd は、いつでもセッションを「事前認証」するのを許可します。この設定は、sshd 設定ファイル(ここでは /etc/ssh/sshd_config)の MaxStartups パラメーターで制御されます。これには、調整が必要になる場合があります。DoS 攻撃(通常はリソースを過剰に活用)しないように制限があるため、このパラメーターを調整する際には注意してください。この値を高すぎると、その目的がなくなります。このパラメーターを変更するには、/etc/ssh/sshd_config ファイルを編集し、MaxStartups 行の先頭に # を削除し、10 (デフォルト値)を高い数に変更します。ファイルを保存して sshd サービスを再起動します。詳細は、man ページの sshd_config を参照してください。

15.5.2. virsh migrate コマンドの追加オプション

virsh migrate では、--live オプションも使用できます。
  • --direct - 直接移行に使用されます。
  • --p2p - used for peer-to-peer migration
  • --tunneled - トンネル化した移行に使用されます。
  • --offline - 宛先でドメインを起動したり、移行元ホストで停止せずにドメイン定義を移行します。オフラインマイグレーションは、非アクティブなドメインと併用できます。また、--persistent オプションと併用する必要があります。
  • --persistent - ドメインを移行先ホストの物理マシンで永続化します。
  • --undefinesource - ソースホストの物理マシンのドメインの定義を解除します。
  • --suspend - 移行先ホストの物理マシンでドメインが一時停止したままになります。
  • --change-protection - 移行中に互換性のない設定変更がドメインに加えられないように強制します。このフラグは、ハイパーバイザーでサポートされる場合に暗黙的に有効になりますが、ハイパーバイザーで変更した保護サポートがない場合、このフラグを明示的に使用して移行を拒否することができます。
  • --unsafe - 移行を強制し、すべての安全手順を無視します。
  • --verbose - 発生時に移行の進捗を表示します。
  • --compressed - ライブマイグレーション中に繰り返し転送する必要があるメモリーページの圧縮を有効にします。
  • --abort-on-error - 移行中にソフトエラー(例: I/O エラー)が発生した場合に移行を取り消します。
  • --domain [name] - ドメイン名、id、または uuid を設定します。
  • --desturi [URI]: クライアント(通常の移行)またはソース(p2p migration)で表示される宛先ホストの接続 URI。
  • --migrateuri [URI]: 通常、省略できる移行 URI。
  • --graphicsuri [URI]: シームレスなグラフィック移行に使用されるグラフィック URI。
  • --listen-address [address]: 宛先側でハイパーバイザーが受信移行をバインドするリッスンアドレスを設定します
  • --timeout [seconds]: ライブマイグレーションカウンターが N 秒を超えるとゲスト仮想マシンが一時停止を強制的に実行します。これはライブマイグレーションでのみ使用できます。タイムアウトが開始されると、移行はサスペンド中のゲスト仮想マシンで続行されます。
  • --dname [newname] - 移行中にドメイン名を変更するために使用されます。通常は省略することも可能です。
  • --xml [filename]: 指定のファイル名を使用して、宛先で使用する代替 XML ファイルを指定し、ドメイン XML のホスト固有の部分にさらに多くの変更を指定できます。たとえば、ソースと宛先間の命名の違いを考慮し、下層のストレージにアクセスするときにソースと宛先間の命名の違いを考慮します。このオプションは通常省略されています。
  • --migrate-disks [disk_identifiers] - このオプションは、移行中にコピーされるディスクの選択に使用できます。これにより、特定のディスクのコピーが、宛先上にすでに存在する場合など、またはそれらが便利でなくなると、ライブマイグレーションがより効率的になります。[disk_identifiers] は、移行するディスクのコンマ区切りリストで置き換える必要があります。ドメイン XML ファイルの <target dev= /> 行にある引数で識別されます。
さらに、以下のコマンドを使用すると、以下も役立ちます。
  • virsh migrate-setmaxdowntime [domain] [downtime] - ドメインに対して、別のホストにライブマイグレーションしているドメインの最大許容ダウンタイムを設定します。指定したダウンタイムはミリ秒です。指定したドメインは、移行中のドメインと同じである必要があります。
  • virsh migrate-compcache [domain] --size - ライブマイグレーション中に繰り返し転送されたメモリーページを圧縮するために使用されるバイト単位のキャッシュサイズを設定します。--size を使用しない場合、コマンドは現在の圧縮キャッシュのサイズを表示します。--size が使用され、バイト単位で指定すると、ハイパーバイザーは、現在のサイズが表示されます。指定のサイズに一致するように圧縮を変更するように求められます。--size 引数は、移行の進捗としてドメインのライブマイグレーションが行われ、domjobinfo から取得した圧縮キャッシュミスの数が増えると想定されます。
  • virsh migrate-setspeed [domain][bandwidth] - 別のホストに移行する指定ドメインの Mib/sec の移行帯域幅を設定します。
  • virsh migrate-getspeed [domain] - 指定したドメインの Mib/sec で利用可能な最大移行帯域幅を取得します。
詳細は、man 移行の制限 virsh を参照してください。