配置实时迁移¶
迁移使管理员能够将虚拟机实例从一个计算主机移动到另一个计算主机。一个典型场景是在源主机上进行计划维护,但迁移也可以用于在特定物理机上运行许多虚拟机实例时重新分配负载。
本文档涵盖使用 Libvirt 和 VMWare 超visor 的实时迁移
注意
并非所有计算服务 hypervisor 驱动程序都支持实时迁移,或者支持所有实时迁移功能。 同样,并非所有计算服务功能都受支持。
请参阅 功能支持矩阵 以确定哪些 hypervisor 支持实时迁移。
有关 hypervisor 配置设置的详细信息,请参阅 配置指南。
迁移类型如下
非实时迁移,也称为冷迁移或简单迁移。
实例被关闭,然后移动到另一个 hypervisor 并重新启动。实例会识别到它已被重新启动,并且实例上运行的应用程序会被中断。
本节不涵盖冷迁移。
实时迁移
实例在整个迁移过程中保持运行。当停止实例上运行的应用程序不可行或不可取时,这很有用。
根据实例存储的处理方式,可以将实时迁移进一步分类
共享存储的实时迁移。实例具有位于源主机和目标主机之间共享的存储上的临时磁盘。
块实时迁移,或简单地块迁移。实例具有在源主机和目标主机之间未共享的临时磁盘。块迁移与只读设备(如 CD-ROM 和配置驱动器 (config_drive))不兼容。
卷支持的实时迁移。实例使用卷而不是临时磁盘。
块实时迁移需要将磁盘从源主机复制到目标主机。这需要更多的时间并给网络带来更大的负载。共享存储和卷支持的实时迁移不会复制磁盘。
注意
在多单元云中,实例可以实时迁移到同一单元中的不同主机,但不能跨单元迁移。有关更多信息,请参阅 cells v2 文档。
以下部分介绍如何使用 libvirt virt 驱动程序和 KVM hypervisor 配置主机以进行实时迁移。
Libvirt¶
常规配置¶
要启用任何类型的实时迁移,请根据以下说明配置计算主机
在所有计算主机上的
nova.conf中设置以下参数server_listen=0.0.0.0您不能使 VNC 服务器侦听其计算主机的 IP 地址,因为该地址在实例迁移时会更改。
重要提示
由于此设置允许来自任何 IP 地址的 VNC 客户端连接到实例控制台,因此必须采取额外的措施,例如安全网络或防火墙,以防止潜在的攻击者访问实例。
instances_path必须在所有计算主机上具有相同的值。在本指南中,假定值为/var/lib/nova/instances。
确保所有计算主机上的名称解析相同,以便它们可以通过主机名相互连接。
如果使用
/etc/hosts进行名称解析并启用 SELinux,请确保/etc/hosts具有正确的 SELinux 上下文# restorecon /etc/hosts
启用无密码 SSH,以便一台计算主机上的 root 可以无需提供密码即可登录到任何其他计算主机。以 root 身份运行的
libvirtd守护程序使用 SSH 协议将实例复制到目标主机,并且无法知道所有计算主机的密码。例如,您可以将 root 的公共 SSH 密钥编译到所有计算主机上的
authorized_keys文件中,并将该文件部署到计算主机。配置防火墙以允许 libvirt 在计算主机之间进行通信。
默认情况下,libvirt 使用 TCP 端口范围 49152 到 49261 来复制内存和磁盘内容。计算主机必须接受此范围内的连接。
有关 libvirt 使用的端口的信息,请参阅 libvirt 文档。
重要提示
请注意打开端口引入的安全风险。
保护实时迁移流¶
如果您的计算节点至少具有 libvirt 4.4.0 和 QEMU 2.11.0,强烈建议您通过利用“QEMU 原生 TLS”功能来保护所有实时迁移流。这需要预先存在的 PKI(公钥基础设施)设置。有关如何设置所有内容的更多详细信息,请参阅 使用 QEMU 原生 TLS 进行安全实时迁移 文档。
块迁移、基于卷的实时迁移¶
如果您的环境满足“QEMU 原生 TLS”的要求,则块迁移需要一些设置;有关详细信息,请参阅上述部分 保护实时迁移流。否则,不需要为块迁移和基于卷的实时迁移进行额外的配置。
请注意,块迁移会给网络和存储子系统带来负载。
KVM 和 QEMU 的高级配置¶
实时迁移会将实例的内存从源主机复制到目标计算主机。在复制内存页后,实例可能会再次对其进行写入,因此必须再次复制它。频繁写入不同内存页的实例可能会使内存复制过程不堪重负并阻止实时迁移完成。
本节涵盖可以帮助成功迁移内存密集型实例的配置设置。
实时迁移完成超时
计算服务将在迁移运行时间过长时中止或强制完成迁移。可以使用
libvirt.live_migration_timeout_action配置选项来配置此行为。超时时间是根据实例大小计算的,即实例的内存大小(以 GiB 为单位)。在块迁移的情况下,将添加临时存储的大小(以 GiB 为单位)。秒数超时时间是实例大小乘以可配置参数
libvirt.live_migration_completion_timeout,其默认值为 800。例如,具有 8GiB 内存的共享存储实时迁移将在 6400 秒后超时。实例停机时间
在内存复制的最后阶段,实例会暂停一小段时间,以便在实例内存写入的干扰下复制剩余的几页。计算服务会将此时间初始化为一个小值,该值取决于实例大小,通常约为 50 毫秒。当它注意到内存复制没有取得足够的进展时,它会逐渐增加该时间。
您可以使用计算主机上的三个配置变量来影响实例停机时间算法
live_migration_downtime = 500 live_migration_downtime_steps = 10 live_migration_downtime_delay = 75
live_migration_downtime设置 Nova 将尝试在内存复制的最后一部分期间保持实例暂停的最大时间,以毫秒为单位。如果 VM 暂停后传输速率下降,则可能会超过此值。默认值为 500。live_migration_downtime_steps设置达到live_migration_downtime的调整步骤总数。默认值为 10 步。live_migration_downtime_delay设置两次调整步骤之间的时间间隔,以秒为单位。默认值为 75。自动收敛
成功迁移内存密集型实例的一种策略是减慢实例的速度。这称为自动收敛。libvirt 和 QEMU 都实现了此功能,通过在检测到内存复制延迟时自动限制实例的 CPU 来实现。
默认情况下禁用自动收敛。您可以通过设置
live_migration_permit_auto_converge=true来启用它。警告
在启用自动收敛之前,请确保实例的应用程序可以容忍速度变慢。
请注意,自动收敛不能保证实时迁移成功。
事后复制
当您启用事后复制时,实时迁移内存密集型实例肯定会成功。此功能由 libvirt 和 QEMU 实现,它在将所有内存复制到目标主机之前激活目标主机上的虚拟机。当虚拟机访问目标主机上缺失的页面时,由此产生的页面错误通过从源主机复制页面来解决。
默认情况下禁用事后复制。您可以通过设置
live_migration_permit_post_copy=true来启用它。当您同时启用自动收敛和事后复制时,自动收敛将保持禁用状态。
警告
事后复制引入的页面错误可能会降低实例的速度。
如果源主机和目标主机之间的网络连接中断,则无法再解决页面错误,并且实例将被重新启动。
重要提示
您可能需要在较新的内核上启用
unprivileged_userfaultfd才能使事后复制工作。sysctl vm.unprivileged_userfaultfd=1
完整的实时迁移配置参数列表记录在 Nova 配置选项 中
VMware¶
vSphere 配置¶
通过遵循 此 KB 文章中的说明,在 Nova 管理的所有 ESX 主机上启用 vMotion。