12.4. 使用命令行界面迁移虚拟机
如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。您可以 执行实时迁移 或 离线迁移。有关这两种情况之间的区别,请参阅如何迁移虚拟机。
先决条件
- hypervisor : 源主机和目标主机都使用 KVM hypervisor。
-
网络连接: 源主机和目标主机可以通过网络互相访问。使用
ping
工具进行验证。 打开端口 :确保目标主机上打开了以下端口。
- 使用 SSH 连接到目标主机需要端口 22。
- 使用 TLS 连接到目标主机需要端口 16509。
- 使用 TCP 连接到目标主机需要端口 16514。
- QEMU 需要端口 49152-49215 ,来传输内存和磁盘迁移数据。
- 主机 : 要红帽支持迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确保情况是这种情况,请查看支持的虚拟机迁移主机。
- cpu: 虚拟机必须与目标主机的 CPU 功能兼容。要确保情况如此,请参阅验证虚拟机迁移的主机 CPU 兼容性。
存储: 将要迁移的虚拟机的磁盘镜像可以被源主机和目标主机访问。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。要确保存储可被两个主机访问,必须应用以下内容之一:
- 您正在使用存储区域网络(SAN)逻辑单元(LUN)。
- 正在您使用 Ceph 存储集群。
-
您已创建了与源虚拟机磁盘 相同的格式和大小的磁盘镜像,在迁移虚拟机时将使用
--copy-storage-all
参数。 - 磁盘镜像在单独的网络位置上。有关设置这样的共享虚拟机存储的步骤,请参阅与其他主机共享虚拟机磁盘镜像。
网络带宽 : 迁移正在运行的虚拟机时,您的网络带宽必须高于虚拟机生成脏内存页面的速度。
要在开始实时迁移之前获取虚拟机的脏页面率,请执行以下操作:
监控虚拟机在短时间内的脏页面生成率。
# virsh domdirtyrate-calc <example_VM> 30
在监控完成后,获取其结果:
# virsh domstats <example_VM> --dirtyrate Domain: 'example-VM' dirtyrate.calc_status=2 dirtyrate.calc_start_time=200942 dirtyrate.calc_period=30 dirtyrate.megabytes_per_second=2
在本例中,VM 每秒会生成 2 MB 的脏内存页面。如果您不暂停虚拟机或降低其工作负载,那么在小于或等于 2 MB/秒带宽的网络中尝试实时迁移这样的虚拟机会导致实时迁移不会进行。
为确保实时迁移成功完成,红帽建议您的网络带宽要明显大于虚拟机的脏页面生成率。
注意calc_period
选项的值可能因工作负载和脏页率而异。您可以使用多个calc_period
值进行试验,以确定与您环境中脏页率一致的最合适的周期。
- 网桥 tap 网络: 在迁移公共网桥 tap 网络中的现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将无法正常工作。
连接协议: 在执行虚拟机迁移时,源主机上的
virsh
客户端可以使用多种协议之一连接到目标主机上的 libvirt 守护进程。以下流程中的示例使用 SSH 连接,但您可以选择不同的连接。如果您希望 libvirt 使用 SSH 连接,请确保启用
virtqemud
套接字并在目标主机上运行。# systemctl enable --now virtqemud.socket
如果您希望 libvirt 使用 TLS 连接,请确保启用
virtproxyd-tls
套接字并在目标主机上运行。# systemctl enable --now virtproxyd-tls.socket
如果您希望 libvirt 使用 TCP 连接,请确保
virtproxyd-tcp
套接字已经启用并在目标主机上运行。# systemctl enable --now virtproxyd-tcp.socket
流程
要将虚拟机从一个主机迁移到另一个主机,请使用 virsh migrate
命令。
离线迁移
以下命令使用 SSH 隧道将关闭的
example-VM
虚拟机从本地主机迁移到example-destination
主机的系统连接。# virsh migrate --offline --persistent <example_VM> qemu+ssh://example-destination/system
实时迁移
以下命令使用 SSH 隧道将
example-VM
虚拟机从本地主机迁移到example-destination
主机的系统连接。虚拟机在迁移过程中继续运行。# virsh migrate --live --persistent <example_VM> qemu+ssh://example-destination/system
等待迁移完成。这个过程可能需要一些时间,具体取决于网络带宽、系统负载和虚拟机的大小。如果
virsh migrate
没有使用--verbose
选项,CLI 不会显示任何进度指示器,除了错误。迁移进行时,您可以使用
virsh domjobinfo
工具显示迁移统计信息。
多 FD 实时迁移
您可以在实时迁移过程中使用到目标主机的多个并行连接。这也被称为多个文件描述符(multi-FD)迁移。借助多 FD 迁移,您可以使用迁移过程的所有可用网络带宽来加快迁移速度。
# virsh migrate --live --persistent --parallel --parallel-connections 4 <example_VM> qemu+ssh://<example-destination>/system
这个示例使用 4 个多 FD 频道来迁移虚拟机 <example_VM>。建议为可用网络带宽的每 10 Gbps 使用一个通道。默认值为 2 通道。
实时迁移,增加的停机时间限制
要提高实时迁移的可靠性,您可以设置
maxdowntime
参数,该参数指定实时迁移期间可暂停的最大时间(毫秒)。设置更大的停机时间有助于确保迁移成功完成。# virsh migrate-setmaxdowntime <example_VM> <time_interval_in_milliseconds>
后复制迁移
如果您的虚拟机有较大的内存占用,您可以执行 复制后 迁移,首先将源虚拟机的 CPU 状态传输,并立即在目标主机上启动迁移的虚拟机。源虚拟机的内存页面在迁移的虚拟机已在目标主机上运行后传输。因此,复制后 迁移可能会导致迁移的虚拟机出现较小的停机时间。
但是,目标主机上运行的虚拟机可能尝试访问尚未传输的内存页面,这会导致 页面错误。如果迁移过程中出现太多 页面错误,则迁移的虚拟机的性能可能会严重降级。
由于 复制后 迁移的潜在复杂情况,建议使用下列命令来启动标准实时迁移,并在指定时间内无法完成实时迁移,并切换到复制后迁移。
# virsh migrate --live --persistent --postcopy --timeout <time_interval_in_seconds> --timeout-postcopy <example_VM> qemu+ssh://<example-destination>/system
自动聚合实时迁移
如果您的虚拟机处于大量内存工作负载中,您可以使用
-auto-converge
选项。这个选项会自动减慢虚拟机 CPU 的执行速度。因此,这个 CPU 节流有助于降低内存写入的速度,这意味着即使有大量内存工作负载的虚拟机,实时迁移也会成功。但是,CPU 节流不有助于解决内存写入与 CPU 执行速度直接相关的工作负载,这可能会影响实时迁移过程中虚拟机的性能。
# virsh migrate --live --persistent --auto-converge <example_VM> qemu+ssh://<example-destination>/system
验证
对于 离线 迁移:
在目标主机上,列出可用的虚拟机以验证虚拟机是否已成功迁移。
# virsh list --all Id Name State ---------------------------------- 10 example-VM-1 shut off
对于 实时迁移 :
在目标主机上,列出可用的虚拟机以验证目标虚拟机的状态:
# virsh list --all Id Name State ---------------------------------- 10 example-VM-1 running
如果虚拟机的状态为
running
,这表示迁移已完成。但是,如果实时迁移仍在进行中,目标虚拟机的状态将列为暂停
。
对于 复制后 迁移:
在源主机上,列出可用的虚拟机以验证源虚拟机的状态。
# virsh list --all Id Name State ---------------------------------- 10 example-VM-1 shut off
在目标主机上,列出可用的虚拟机以验证目标虚拟机的状态。
# virsh list --all Id Name State ---------------------------------- 10 example-VM-1 running
如果源虚拟机的状态为
shut off
,并且目标虚拟机的状态被列为running
,这表示迁移已完成。
其它资源
-
virsh migrate --help
命令 -
您系统上的
virsh (1)
手册页