KVM 仮想マシンのオンライン ホット マイグレーションを実装する方法 (画像とテキスト)

KVM 仮想マシンのオンライン ホット マイグレーションを実装する方法 (画像とテキスト)

1. KVM仮想マシンの移行方法と注意すべき点

KVM 仮想マシンを移行する方法は 2 つあります。
1. 静的移行 (コールド移行): コールド移行では、仮想マシンの電源がオフになっているときに、仮想マシンのディスク ファイルと .xml 構成ファイル (この 2 つのファイルが仮想マシンを構成します) を移行先のホストにコピーし、ターゲット ホストで「virsh define *.xml」コマンドを使用して仮想マシンを再定義します。
2. 動的移行 (ホット移行): ホット移行はより一般的に使用されます。通常、このサーバーではいくつかのサービスが実行されており、これらのサービスは中断できないため、ホット移行が必要です。このブログ投稿では、ホット移行の手順について詳しく説明します。

1. コールドマイグレーション

通常、仮想マシン ディスクを保存するディレクトリは、nfs ファイル システムを持つディスクにマウントされ、このディスクは通常 LVM ファイル システムです。したがって、コールド移行が必要な場合は、ターゲット ホストに nfs ファイル システムをマウントするだけで、移行する仮想マシンのディスク ファイル (通常は .qcow2 または .raw で終わる) を確認できます。次に、仮想マシンの .xml 構成ファイルをターゲット サーバーに送信し、再定義します。移行された仮想マシンは、「virsh list --all」コマンドで確認できます。

2. ホットマイグレーション

ソースホストと宛先ホストがストレージシステムを共有している場合は、クライアントの vCPU 実行状態、メモリ内容、仮想マシンデバイス状態をネットワーク経由で宛先ホストに送信するだけで済みます。それ以外の場合は、クライアントのディスク ストレージを宛先ホストに送信する必要があります。共有ストレージ システムとは、ソース仮想マシンとターゲット仮想マシンのイメージ ファイル ディレクトリが共有ストレージ上にあることを意味します。

共有ストレージ システムをベースとする場合、KVM 動的移行の具体的なプロセスは次のとおりです。

1. 移行が開始されると、クライアントはホスト上でまだ実行されており、同時に、クライアントのメモリ ページが宛先ホストに転送されます。
2. QEMU/KVM は、移行プロセス中に転送されたすべての内部ページへの変更を監視および記録し、すべてのメモリ ページが転送された後に、前のプロセスでメモリ ページへの変更の転送を開始します。
3. QEMU/KVM は移行プロセス中に転送速度を推定します。残りのメモリ データを設定可能な時間 (デフォルトでは 30 ミリ秒) 内に転送できる場合、QEMU/KVM はソース ホスト上のクライアントをシャットダウンし、残りのデータを宛先ホストに転送します。最後に、転送されたメモリ コンテンツによって、宛先ホスト上のクライアントの実行状態が復元されます。
4. この時点で、KVM の動的移行操作は完了です。移行先のホストでブリッジなどの一部の構成が欠落していない限り、移行されたクライアントは移行前のクライアントと可能な限り一貫性が保たれます。クライアントのメモリ使用量が非常に高く、頻繁に変更され、メモリ内のデータが絶えず変更される速度が KVM が送信できるメモリ速度よりも速い場合、動的移行プロセスは完了できず、静的移行のみが実行できることに注意してください。

3. 移行に関する考慮事項

コールド移行でもホット移行でも、注意事項はほぼ同じです。

移行前のターゲット サーバーの要件は次のとおりです。

  • 同じ CPU ブランドのサーバーを移行するのが最適です。
  • 64 ビットは 64 ビット ホスト間でのみ移行でき、32 ビットは 32 ビット ホストと 64 ビット ホスト間で移行できます。
  • ホスト マシン内の仮想マシンの名前は競合できません。
  • 宛先ホストと送信元ホストは、同じブリッジ ネットワーク カード、リソース プールなど、可能な限り同じソフトウェア構成を持ちます。
  • 移行した 2 つのホストの cat /proc/cpuinfo |grep nx の設定は同じです。NX の正式名称は「No eXecute」で、「実行しない」という意味です。これは、CPU に適用される技術で、メモリ領域をプロセッサ命令セットのみを格納する領域とデータのみを格納する領域に分離します。 NX テクノロジを使用するメモリはデータのみとして表現されるため、プロセッサの命令セットをこれらの領域に格納することはできません。この技術は、バッファオーバーフロー、つまり、一部の悪意のあるプログラムが独自の悪意のある命令セットを他のプログラムのデータ保存領域に配置して実行し、それによってコンピュータ全体を制御するという攻撃のほとんどを防ぐことができます。

まとめ:

1. 静的移行

  • イメージ ファイルと仮想マシン構成ファイルをコピーします。
  • この仮想マシンを再定義します。
2. 動的移行
  • 共有ストレージを作成します。
  • 両方のマシンに共有ストレージをマウントします (手動で、リソース プールを使用します)。
  • 動的移行を開始します。
  • 移行された仮想マシンの構成ファイルを作成します。
  • 仮想マシンを再定義します。

2. KVM仮想マシンのホットマイグレーション構成例

1. 環境整備:

私の環境は次のとおりです。

3 台の Linux サーバー (そのうち 2 台は KVM サーバー)、IP アドレスは 192.168.20.2 と 192.168.20.3。 1 つは、共有ストレージに使用される、IP アドレスが 192.168.20.4 の NFS サーバーです (3 つのサーバーは相互に ping できる必要があります)。
両方の KVM 仮想マシンに KVM 環境が必要です。

既製の KVM 環境があるので、ここでは紹介しません。KVM 環境がない場合は、ブログ記事「KVM 仮想化の基本管理」を参照して設定してください (非常に簡単で、yum でいくつかのパッケージをインストールし、「libvirtd」サービスを開始するだけです。サーバーの再起動が必要になる場合があります)。

2. NFS共有ストレージを構成する

NFS サーバー 192.168.20.4 は次のように構成されています。

[root@nfs ~]# yum -y install nfs-utils rpcbind #必要なソフトウェア パッケージをインストールします[root@localhost ~]# systemctl enable nfs #NFS が自動的に起動するように設定します[root@localhost ~]# systemctl enable rpcbind #rpcbind が自動的に起動するように設定します[root@nfs ~]# mkdir -p /nfsshare #共有するディレクトリを作成します[root@nfs ~]# vim /etc/exports #NFS 構成ファイルを編集します。デフォルトは空です/nfsshare *(rw,sync,no_root_squash)
#最初の列は共有ディレクトリを表します。#2 番目の列のアスタリスクは、すべてのネットワーク アクセスが許可されていることを意味します。
#rw は読み取りおよび書き込み権限を表し、sync はディスクへの同期書き込みを表します。
#no_root_squashは、現在のクライアントがrootとしてアクセスするときにローカルルート権限を付与されることを意味します(デフォルトはroot_squashで、nfsnobodyユーザーとして扱われます)。no_root_squashが追加されると、
#権限がダウングレードされ、読み取りと書き込み (wr) が不可能になる可能性があります。
[root@nfs ~]# systemctl restart rpcbind #サービスを開始します[root@nfs ~]# systemctl restart nfs #サービスを開始します[root@nfs ~]# netstat -anpt | grep rpc #サービスが開始されたことを確認します[root@nfs ~]# showmount -e #このマシンの共有ディレクトリを表示しますnfs のエクスポート リスト:
/nfsシェア*
[root@nfs ~]# ファイアウォール-cmd --add-service=rpc-bind --permanent 
[root@nfs ~]# ファイアウォール-cmd --add-service=nfs --permanent 
[root@nfs ~]# ファイアウォール-cmd --add-service=mountd --permanent 
[root@nfs ~]# systemctl restart firewalld #設定を有効にするにはファイアウォールを再起動します

NFS サーバーの構成が完了しました。 ! !

ここでの移行操作はデスクトップのグラフィカル環境に依存します。コマンド移行を使用する必要がある場合は、このドキュメントをダウンロードして参照できます。コマンド移行の使用については研究していません。

2 つの KVM サーバーは次のように構成されています (両方の KVM ホストも次のように構成する必要があります)。

1. rpcbind ソフトウェア パッケージをインストールし、rpcbind サービスを開始します。showmount クエリ ツールを使用するには、nfs-utils もインストールします。

[root@localhost ~]# yum -y nfs-utils rpcbindをインストールします 
[root@localhost ~]# systemctl rpcbind を有効にする
[root@localhost ~]# systemctl rpcbind を開始します
[root@kvm ~]# showmount -e 192.168.20.4 #NFS サーバーによって共有されているディレクトリを照会します 192.168.20.4 のエクスポート リスト:
/nfsシェア*
[root@kvm ~]# mount -t nfs 192.168.20.4:/nfsshare /kvm/disk/ #マウント [root@kvm ~]# df -hT /kvm/disk/
ファイルシステムの種類 容量 使用済み 使用可能 使用済み% マウントポイント 192.168.20.4:/nfsshare nfs4 50G 33M 50G 1% /kvm/disk
# サーバーの 1 つにテスト ファイルを書き込んで、他のサーバーで表示できるかどうかを確認します [root@kvm1 ~]# touch /kvm/disk/test # kvm サーバーの 1 つにテスト ファイルを作成します [root@kvm2 ~]# ls /kvm/disk # テストが 2 番目の kvm サーバーのディレクトリでも表示されることを確認します

この時点で、2 つの kvm サーバーが使用するディレクトリが同じディスクに保存されていることが保証されます (注: 2 つの kvm 仮想マシンの nfs ファイル システムをマウントするためのディレクトリ パスは一貫している必要があります。ここでは、両方の kvm 仮想マシンが /kvm/disk/ ディレクトリにマウントされています。そうでない場合、後続の操作でエラーが発生します)。

3. 2 つの KVM サーバーにストレージ ボリュームを作成します。

[root@kvm1 ~]# virt-manager #仮想マシンコンソールを開く


次のダイアログ ボックスでは、ターゲット パスは KVM マシンの「/kvm/disk」、ホスト名は nfs サーバーの IP アドレス、ソース パスは nfs サーバーによって共有されるディレクトリです。

上記の操作は 2 番目の KVM でも実行する必要があります。同じストレージ プール名を定義するのが最適です。不要なトラブルを避けるためです。

3. 移行テスト用にkvm1に新しい仮想マシンを作成する

:



Centos iso システム ファイルを自分でアップロードします。ここで、インストールする iso ファイルを指定する必要があります。


この時点で、仮想マシンを通常どおりインストールできます。

4. 新しく作成した仮想マシンネットワークをブリッジモードに設定し、外部ネットワークにpingを送信します。

以下の操作は主に、パブリック ネットワーク ユーザーにサービスを提供する際に仮想マシンのホット マイグレーションをシミュレートするためのものです。

1) kvm1 の動作は以下のとおりです。

[root@kvm ~]# systemctl stop NetworkManager #このサービスを停止します[root@kvm ~]# virsh iface-bridge ens33 br0 #このコマンドを実行すると、次のメッセージが表示されても心配はいりません。すでに存在しているためです。追加のデバイス br0 を使用してブリッジ ens33 を生成します。ブリッジ インターフェイス br0 の起動に失敗しました
[root@kvm ~]# ls /etc/sysconfig/network-scripts/ | grep br0  
ifcfg-br0 #このファイルが存在することを確認します[root@kvm ~]# virsh destroy centos7.0 #新しく作成された仮想マシンドメインを閉じます centos7.0 は削除されます[root@kvm ~]# virsh edit centos7.0 #仮想マシン構成ファイルを編集し、インターフェイスを見つけます
<interface type='bridge'> #これをブリッジに変更します
 <mac address='52:54:00:a9:cc:5f'/> #Mac アドレス行を削除します <source bridge='br0'/> #これを次のように変更します #保存して終了します [root@kvm1 ~]# virsh start centos7.0 
ドメインcentos7.0が開始しました

仮想マシンを起動したら、仮想マシンのネットワーク カード構成ファイルを設定します。デフォルトのネットワーク カード ファイルは ifcfg-eth0 です。


ネットワーク サービスを再起動し、IP アドレスを確認します。

これで、仮想マシン上で「ping www.baidu.com」コマンドを実行し、パブリック ネットワークに継続的に ping を実行できるようになります。


2) kvm2 の操作は次のとおりです。

[root@kvm ~]# systemctl stop NetworkManager #このサービスを停止します[root@kvm ~]# virsh iface-bridge ens33 br0 #このコマンドを実行すると、次のメッセージが表示されても心配はいりません。すでに存在しているためです。追加のデバイス br0 を使用してブリッジ ens33 を生成します。ブリッジ インターフェイス br0 の起動に失敗しました
[root@kvm ~]# ls /etc/sysconfig/network-scripts/ | grep br0  
ifcfg-br0 #このファイルが存在することを確認してください。#kvm2 には仮想マシンがないため、ネットワークをブリッジ モードに変更するだけで済みます。
#上記の構成は、仮想マシンがこのサーバーに移行された後にパブリックネットワークと通信できなくなるのを防ぐためのものです。

5. 新しく構築した Centos 7 のホットマイグレーションの準備を開始する

1) kvm1 サーバーで次の操作を実行します。

[root@kvm1 ~]# virt-manager #仮想マシンコンソールを開く

次のようにフォームに入力し、完了したら「接続」をクリックします。

次のソフトウェア パッケージをインストールするように求められます。

インストールするには:

[root@kvm1 ~]# yum -y openssh-askpassをインストールします

ポップアップ表示されるダイアログボックスに従って、「はい」と入力します。

ターゲットホストのルートパスワードを入力します。

6. ホットマイグレーションを開始する

移行は短時間で完了しますので、完了するまでお待ちください。

移行完了:

次に、ターゲットの kvm サーバーに移動し、新しく移行した仮想マシンを開きます (ping コマンドがまだ継続しており、中断されていないことがわかります)。

2 つの kvm サーバーで「virsh list --all」を使用して、仮想マシンが 2 番目の kvm サーバーに移行されたかどうかを確認できます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • KVM の紹介と機能の詳細な説明
  • KVM 仮想化のインストール、展開、管理のチュートリアル
  • KVM仮想マシンイメージの拡張および圧縮操作

<<:  Vueストレージにはブール値のソリューションが含まれています

>>:  Bツリーの削除プロセスの紹介

推薦する

MySQL 8.0 WITH クエリの詳細

目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...

JavaScript Alert関数の実行順序の詳細な説明

目次質問分析する解決するAlert() 関数を置き換えるsetTimeOut関数まとめ質問数日前、J...

MySQL 最適化のケーススタディ

1. 背景Youzan の各 OLTP データベース インスタンスには、実行時間が特定のしきい値を超...

Vueは商品詳細ページの虫眼鏡機能を実装します

この記事では、商品詳細ページの虫眼鏡を実装するためのVueの具体的なコードを参考までに共有します。具...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

Docker ベースの ELK を素早く構築する方法

[概要] この記事では、自作の Docker プラットフォームをベースに完全な ELK システムを素...

Python で pymysql モジュールを使用して MySQL データベースに接続する

pymysqlをインストールするpip install pymysql 2|0pymysqlの使用2...

HTML ファイルにファイルの内容を含める方法の概要

フォーラムでは、ネットユーザーから「HTML ファイル内の別の HTML ファイルの内容を読み取るこ...

CSS transform-originプロパティを理解する

序文最近、花火アニメーションを作成しました。花火が散るアニメーションです。アニメーションの実装中、花...

Ubuntu 20.04 と NVIDIA ドライバーのインストールに関するチュートリアル

Ubuntu 20.04をインストールする NVIDIAドライバーをインストールする Pytouch...

Vue3 がコンポーネント通信に mitt を使用する手順

目次1. インストール2. プロジェクトにインポートしてマウントする3. 使用Vue2.x はコンポ...

シンプルなカルーセル効果を実現するJavaScript

カルーセルとは何ですか?カルーセル: モジュールまたはウィンドウで、コンピューターでマウスをクリック...

Centos7 での DNS サーバーの構築の概要

目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...

Linuxカーネルがプロセスアドレス空間に侵入し、プロセスメモリを変更する方法

プロセス アドレス空間の分離は、現代のオペレーティング システムの注目すべき機能です。これは、「古い...

JS ネイティブ 2048 ゲーム ソース コード共有 (インターネットの最新情報)

最近、アルゴリズムについて学んでいて、アルゴリズムで動く小さなゲームに出会いました。そのコードは次の...