6.14. 在主机之间迁移虚拟机
实时迁移提供了在物理主机之间移动正在运行的虚拟机,而不会中断服务的功能。虚拟机重新定位到新的物理主机时,虚拟机仍保持开机状态,并且用户应用程序将继续运行。在后台,虚拟机的 RAM 从源主机复制到目标主机。不会更改存储和网络连接。
使用 vGPU 的虚拟机无法迁移到其他主机。
6.14.1. 实时迁移前提条件
这是显示如何在 Red Hat Virtualization 上设置和配置 SR-IOV 的一系列主题中的一个。如需更多信息,请参阅设置和配置 SR-IOV
您可以使用实时迁移无缝移动虚拟机,以支持多种常见的维护任务。您的 Red Hat Virtualization 环境必须正确配置,以便在使用实时迁移前很好地支持它。
要成功实时迁移虚拟机,至少必须满足以下先决条件:
- 源和目标主机是同一集群的成员,确保它们之间的 CPU 兼容性。
通常不建议在不同集群间实时迁移虚拟机。
-
源和目标主机的状态为
Up
。 - 源和目标主机对相同的虚拟网络和 VLAN 具有访问权限。
- 源和目标主机对包含虚拟机的数据存储域具有访问权限。
- 目标主机有足够的 CPU 容量来支持虚拟机的需求。
- 目标主机具有足够的未使用 RAM,以支持虚拟机的需求。
-
迁移的虚拟机没有设置
cache!=none
自定义属性。
实时迁移通过管理网络来执行,涉及在主机之间传输大量数据。并发迁移具有使管理网络饱和的可能性。为获得最佳性能,请为管理、存储、显示和虚拟机数据创建单独的逻辑网络,以最大程度降低网络饱和的风险。
6.14.2. 使用 SR-IOV-Enabled vNIC 配置虚拟机以便在迁移过程中减少网络中断
直接连接到支持 SR-IOV 的主机 NIC 的虚拟功能(VF)的 vNIC 的虚拟机可以进一步配置,以减少实时迁移过程中的网络中断:
- 确保目标主机具有可用的 VF。
- 在 passthrough vNIC 的配置集中设置 Passthrough 和 Migratable 选项。请参阅管理指南中的 vNIC 配置文件启用 Passthrough。
- 为虚拟机的网络接口启用热插拔功能。
- 确保虚拟机除了 passthrough vNIC 外还具有备份 VirtIO vNIC,以便在迁移期间维护虚拟机的网络连接。
-
在配置绑定前,设置 VirtIO vNIC 的
No Network Filter
选项。请参阅管理指南中的虚拟机接口配置文件窗口中的设置说明。 将两个 vNIC 作为从设备添加到虚拟机上的
active-backup
绑定下,并将 passthrough vNIC 作为主接口。可使用以下方法之一配置绑定和 vNIC 配置集:
这个绑定没有使用
fail_over_mac=active
配置,VF vNIC 是主从设备
(推荐)。禁用 VirtIO vNIC 配置集的 MAC-spoofing 过滤器,以确保通过 VirtIO vNIC vNIC 的流量不会丢弃,因为它使用了 VF vNIC MAC 地址。
该绑定配置了
fail_over_mac=active
。此故障转移策略确保绑定的 MAC 地址始终是活跃的从设备的 MAC 地址。在故障转移期间,虚拟机的 MAC 地址会发生更改,流量略有中断。
6.14.3. 使用 SR-IOV-Enabled vNIC 配置虚拟机,停机时间最小
要配置虚拟机以使用启用了 SR-IOV 的 vNIC 和最小停机时间进行迁移,请按照以下步骤操作。
以下步骤仅作为技术预览提供。如需更多信息,请参阅红帽技术预览功能支持范围。
- 创建启用了 SR-IOV vNICS 的 vNIC 配置集。请参阅创建 vNIC 配置集 以及设置和配置 SR-IOV。
-
在管理门户中,进入 Network → VNIC 配置集,选择 vNIC 配置集,点 Edit,然后从下拉列表中选择
Failover vNIC 配置集
。 - 单击 OK 以保存配置文件设置。
通过您创建的故障切换 vNIC 配置集将网络接口热插拔到虚拟机中,或者启动使用此网络接口插入的虚拟机。
注意虚拟机有三个网络接口:控制器接口和两个二级接口。控制器接口必须活跃并连接才能成功迁移。
要使用此配置自动部署虚拟机,请使用以下
udev
规则:UBSYSTEM=="net", ACTION=="add|change", ENV{ID_NET_DRIVER}!="net_failover", ENV{NM_UNMANAGED}="1", RUN+="/bin/sh -c '/sbin/ip link set up $INTERFACE'"
此
udev
规则仅适用于通过NetworkManager
管理接口的系统上。此规则确保仅激活控制器接口。
6.14.4. 优化实时迁移
实时迁移可以是资源密集型操作。要优化实时迁移,您可以为环境中的每个虚拟机设置以下两个选项,分别用于集群中的每个虚拟机或单独的虚拟机。
集群级别 4.2 或更早版本提供了 Auto Converge migration 和 Enable migration 压缩选项。
对于集群级别 4.3 或更高版本,会默认对所有内置迁移策略启用自动聚合功能,并在 需要迁移策略时,只为 Suspend 工作负载
启用迁移压缩。您可以在添加新迁移策略时更改这些参数,或者修改 MigrationPolicies
配置值。
Auto Converge 迁移选项允许您设置在虚拟机实时迁移过程中是否使用自动协调。具有高负载的大型虚拟机可以比实时迁移过程中实现的传输率快得多,并防止迁移聚合。QEMU 中的自动聚合功能允许您强制进行虚拟机迁移。QEMU 自动检测缺乏聚合并触发虚拟机上 vCPU 节流。
通过 Enable migration 压缩选项,可以设置在虚拟机实时迁移过程中是否使用迁移压缩。此功能使用 Xor Binary Zero Run-Length-Encoding 以减少虚拟机停机时间,并减少了运行内存写入负载的虚拟机的实时迁移时间,或适用于具有稀疏内存更新模式的任何应用程序。
默认情况下,这两个选项都被禁用。
流程
在全局级别启用自动协调:
# engine-config -s DefaultAutoConvergence=True
在全局级别启用迁移压缩:
# engine-config -s DefaultMigrationCompression=True
重启 ovirt-engine 服务以应用更改:
# systemctl restart ovirt-engine.service
为集群配置优化设置:
- 点 Compute → Clusters 并选择集群。
- 点 Edit。
- 点 Migration Policy 选项卡。
- 从 Auto Converge 迁移列表中,选择 Inherit from global setting, Auto Converge, 或 Don’t Auto Converge
- 从 Enable migration compression 列表中,选择 Inherit from global setting, Compress, 或 Don’t Compress。
- 点击 确定。
在虚拟机级别配置优化设置:
- 单击 Compute → Virtual Machines 并选择虚拟机。
- 点 Edit。
- 单击 主机 选项卡。
- 从 Auto Converge 迁移列表中,选择 Inherit from cluster setting, Auto Converge, 或 Don’t Auto Converge。
- 从 Enable migration compression 列表中,选择 Inherit from cluster setting, Compress, 或 Don’t Compress。
- 点击 确定。
6.14.5. 客户机代理 Hook
Hook 是在发生关键事件时在虚拟机中触发活动的脚本:
- 迁移前
- 迁移后
- 休眠前
- 休眠后
hook 配置基础目录在 Linux 系统中为 /etc/ovirt-guest-agent/hooks.d
。
每个事件都有对应的子目录:pre_migration
和 after_migration
、pre_hibernation
和 after_hibernation
。将执行该目录中的所有文件或符号链接。
Linux 系统上执行的用户是 ovirtagent
。如果脚本需要 root
权限,则必须由 hook 脚本的创建者执行电梯。
6.14.6. 自动虚拟机迁移
当主机进入维护模式时,Red Hat Virtualization Manager 会自动实时迁移主机上运行的所有虚拟机。每个虚拟机的目的地主机在迁移虚拟机时进行评估,以便在集群中分散负载。
从版本 4.3 中,当主机进入维护模式时,使用手动或自动迁移模式定义的所有虚拟机都会被迁移。但是,对于高性能和/或固定虚拟机,系统会显示维护主机窗口,要求您确认该操作,因为目标主机上的性能可能低于当前主机上的性能。
管理器会自动启动虚拟机的实时迁移,以根据调度策略保持负载平衡或省电级别。指定最适合您的环境需求的调度策略。您还可以根据需要禁用特定虚拟机的自动实时迁移,甚至手动实时迁移。
如果您的虚拟机配置了高性能,并且/或已固定(通过设置 Passthrough Host CPU、CPU Pinning 或 NUMA Pinning),则迁移模式被设置为只允许手动迁移。但是,如果需要,可将其改为 Allow Manual 和 Automatic 模式。在更改默认迁移设置时应特别注意,以便它不会导致虚拟机迁移到不支持高性能或固定功能的主机。
6.14.7. 防止虚拟机的自动迁移
Red Hat Virtualization Manager 允许您禁用虚拟机的自动迁移。您还可以通过将虚拟机设置为仅在特定主机上运行来禁用虚拟机的手动迁移。
使用应用程序高可用性产品(如红帽高可用性或集群套件)时,禁用自动迁移并需要虚拟机在特定主机上运行时很有用。
防止虚拟机的自动迁移
- 单击 Compute → Virtual Machines 并选择虚拟机。
- 点 Edit。
- 单击 主机 选项卡。
在 Start Running On 部分中,选择 Any Host in Cluster 或 Specific Host(s),这可让您选择多个主机。
警告对于 Red Hat Virtualization 高可用性,将虚拟机明确分配给特定主机和禁用迁移是互斥的。
重要如果虚拟机上已直接附加了主机设备,并且指定了不同的主机,则之前主机中的主机设备将自动从虚拟机中删除。
- 从 Migration Options 下拉列表中选择 Allow manual migration only 或 Do not allow migration。
- 点击 确定。
6.14.8. 手动迁移虚拟机
运行的虚拟机可以实时迁移到其指定主机群集内的任意主机。虚拟机的实时迁移不会造成任何服务中断。如果特定主机上的负载过高,将虚拟机迁移到其他主机特别有用。有关实时迁移先决条件,请参阅 实时迁移先决条件。
对于使用 Pass-Through Host CPU、CPU Pinning 或 NUMA Pinning 定义的高性能虚拟机和/或虚拟机,默认的迁移模式为 Manual。选择 Select Host Automatically,以便虚拟机迁移到提供最佳性能的主机。
当您将主机置于维护模式时,在该主机上运行的虚拟机会自动迁移到同一群集中的其他主机上。您不需要手动迁移这些虚拟机。
通常不建议在不同集群间实时迁移虚拟机。
流程
- 单击 Compute → Virtual Machines 并选择正在运行的虚拟机。
- 点 Migrate。
使用单选按钮选择 Select Host Automatically,或选择 Select Destination Host 并在下拉列表中指定主机。
注意选择 Select Host Automatically 选项后,系统会根据调度策略中设置的负载平衡和电源管理规则,确定将虚拟机迁移到哪一主机。
- 点击 确定。
迁移过程中,迁移进度会在 迁移 进度栏中显示。迁移完成后,Host 列将更新以显示虚拟机已迁移到的主机。
6.14.9. 设置迁移优先级
Red Hat Virtualization Manager 为从给定主机迁移虚拟机的并发请求排队。负载平衡过程每分钟运行一次。在迁移事件完成后,已参与迁移事件的主机不会包含在迁移周期中。当队列中存在迁移请求以及集群中的可用主机时,会按照集群的负载平衡策略触发迁移事件。
您可以通过设置每个虚拟机的优先级来影响迁移队列的顺序;例如,设置关键任务虚拟机以在其他虚拟机之前迁移。迁移将按照优先级排序;优先级最高的虚拟机将首先迁移。
设置迁移优先级
- 单击 Compute → Virtual Machines 并选择虚拟机。
- 点 Edit。
- 选择 High Availability 选项卡。
- 从 优先级 下拉菜单中选择 Low、Medium 或 High。
- 点击 确定。
6.14.10. 取消持续虚拟机迁移
虚拟机迁移所需的时间比预期的要长。您希望确保所有虚拟机都在运行于何处,然后再对您的环境进行任何更改。
流程
- 选择迁移的虚拟机。它显示在 Compute → Virtual Machines 中,状态为 Migrating from。
- 点 More Actions ( ,然后点 Cancel Migration。
从 Migrating from 返回的虚拟机的状态为 Up。
6.14.11. 自动迁移高可用性虚拟服务器时的事件和日志通知
当由于高可用性功能自动迁移虚拟服务器时,自动迁移的详情会在 Events 标签页和引擎日志中记录,以帮助进行故障排除,如下例所示:
例 6.4. 在管理门户的事件选项卡中通知
高可用性 Virtual_Machine_Name 失败。它将自动重新启动。
Virtual_Machine_Name 在 Host Host_Name上重启
例 6.5. Manager engine.log 中的通知
此日志可在 Red Hat Virtualization Manager 的 /var/log/ovirt-engine/engine.log 中找到:
启动高可用性虚拟机失败。尝试重新启动。VM 名称: Virtual_Machine_Name, VM Id:_Virtual_Machine_ID_Number_