配置实时迁移

迁移使管理员能够将虚拟机实例从一个计算主机移动到另一个计算主机。一个典型场景是在源主机上进行计划维护,但迁移也可以用于在特定物理机上运行许多虚拟机实例时重新分配负载。

本文档涵盖使用 Libvirt 和 VMWare 超visor 的实时迁移

注意

并非所有计算服务 hypervisor 驱动程序都支持实时迁移,或者支持所有实时迁移功能。 同样,并非所有计算服务功能都受支持。

请参阅 功能支持矩阵 以确定哪些 hypervisor 支持实时迁移。

有关 hypervisor 配置设置的详细信息,请参阅 配置指南

迁移类型如下

  • 非实时迁移,也称为冷迁移或简单迁移。

    实例被关闭,然后移动到另一个 hypervisor 并重新启动。实例会识别到它已被重新启动,并且实例上运行的应用程序会被中断。

    本节不涵盖冷迁移。

  • 实时迁移

    实例在整个迁移过程中保持运行。当停止实例上运行的应用程序不可行或不可取时,这很有用。

    根据实例存储的处理方式,可以将实时迁移进一步分类

    • 共享存储的实时迁移。实例具有位于源主机和目标主机之间共享的存储上的临时磁盘。

    • 块实时迁移,或简单地块迁移。实例具有在源主机和目标主机之间未共享的临时磁盘。块迁移与只读设备(如 CD-ROM 和配置驱动器 (config_drive))不兼容。

    • 卷支持的实时迁移。实例使用卷而不是临时磁盘。

    块实时迁移需要将磁盘从源主机复制到目标主机。这需要更多的时间并给网络带来更大的负载。共享存储和卷支持的实时迁移不会复制磁盘。

注意

在多单元云中,实例可以实时迁移到同一单元中的不同主机,但不能跨单元迁移。有关更多信息,请参阅 cells v2 文档

以下部分介绍如何使用 libvirt virt 驱动程序和 KVM hypervisor 配置主机以进行实时迁移。

Libvirt

常规配置

要启用任何类型的实时迁移,请根据以下说明配置计算主机

  1. 在所有计算主机上的 nova.conf 中设置以下参数

    • server_listen=0.0.0.0

      您不能使 VNC 服务器侦听其计算主机的 IP 地址,因为该地址在实例迁移时会更改。

      重要提示

      由于此设置允许来自任何 IP 地址的 VNC 客户端连接到实例控制台,因此必须采取额外的措施,例如安全网络或防火墙,以防止潜在的攻击者访问实例。

    • instances_path 必须在所有计算主机上具有相同的值。在本指南中,假定值为 /var/lib/nova/instances

  2. 确保所有计算主机上的名称解析相同,以便它们可以通过主机名相互连接。

    如果使用 /etc/hosts 进行名称解析并启用 SELinux,请确保 /etc/hosts 具有正确的 SELinux 上下文

    # restorecon /etc/hosts
    
  3. 启用无密码 SSH,以便一台计算主机上的 root 可以无需提供密码即可登录到任何其他计算主机。以 root 身份运行的 libvirtd 守护程序使用 SSH 协议将实例复制到目标主机,并且无法知道所有计算主机的密码。

    例如,您可以将 root 的公共 SSH 密钥编译到所有计算主机上的 authorized_keys 文件中,并将该文件部署到计算主机。

  4. 配置防火墙以允许 libvirt 在计算主机之间进行通信。

    默认情况下,libvirt 使用 TCP 端口范围 49152 到 49261 来复制内存和磁盘内容。计算主机必须接受此范围内的连接。

    有关 libvirt 使用的端口的信息,请参阅 libvirt 文档

    重要提示

    请注意打开端口引入的安全风险。

保护实时迁移流

如果您的计算节点至少具有 libvirt 4.4.0 和 QEMU 2.11.0,强烈建议您通过利用“QEMU 原生 TLS”功能来保护所有实时迁移流。这需要预先存在的 PKI(公钥基础设施)设置。有关如何设置所有内容的更多详细信息,请参阅 使用 QEMU 原生 TLS 进行安全实时迁移 文档。

块迁移、基于卷的实时迁移

如果您的环境满足“QEMU 原生 TLS”的要求,则块迁移需要一些设置;有关详细信息,请参阅上述部分 保护实时迁移流。否则,不需要为块迁移和基于卷的实时迁移进行额外的配置。

请注意,块迁移会给网络和存储子系统带来负载。

共享存储

计算主机有多种共享存储的选项,例如 NFS、共享磁盘阵列 LUN、Ceph 或 GlusterFS。

以下步骤显示了如何将常规 Linux 系统配置为用于实时迁移的 NFS v4 服务器。有关详细信息和配置 Linux 上 NFS 的替代方法,请参阅 UbuntuRHEL 及其衍生版本SLES 和 OpenSUSE 的说明。

  1. 确保计算主机和 NFS 服务器上 nova 用户的 UID 和 GID 相同。

  2. 创建一个具有足够磁盘空间的目录,用于云中的所有实例,该目录由用户 nova 拥有。在本指南中,我们假设 /var/lib/nova/instances

  3. 设置 instances 目录上的执行/搜索位

    $ chmod o+x /var/lib/nova/instances
    

    这允许 qemu 访问 instances 目录树。

  4. /var/lib/nova/instances 导出到计算主机。例如,将以下行添加到 /etc/exports

    /var/lib/nova/instances *(rw,sync,fsid=0,no_root_squash)
    

    星号允许任何 NFS 客户端访问。选项 fsid=0 将 instances 目录导出为 NFS 根。

设置 NFS 服务器后,在所有计算主机上挂载远程文件系统。

  1. 假设 NFS 服务器的主机名为 nfs-server,将此行添加到 /etc/fstab 以挂载 NFS 根

    nfs-server:/ /var/lib/nova/instances nfs4 defaults 0 0
    
  2. 通过挂载 instances 目录并检查 nova 用户的访问权限来测试 NFS

    $ sudo mount -a -v
    $ ls -ld /var/lib/nova/instances/
    drwxr-xr-x. 2 nova nova 6 Mar 14 21:30 /var/lib/nova/instances/
    

KVM 和 QEMU 的高级配置

实时迁移会将实例的内存从源主机复制到目标计算主机。在复制内存页后,实例可能会再次对其进行写入,因此必须再次复制它。频繁写入不同内存页的实例可能会使内存复制过程不堪重负并阻止实时迁移完成。

本节涵盖可以帮助成功迁移内存密集型实例的配置设置。

  1. 实时迁移完成超时

    计算服务将在迁移运行时间过长时中止或强制完成迁移。可以使用 libvirt.live_migration_timeout_action 配置选项来配置此行为。超时时间是根据实例大小计算的,即实例的内存大小(以 GiB 为单位)。在块迁移的情况下,将添加临时存储的大小(以 GiB 为单位)。

    秒数超时时间是实例大小乘以可配置参数 libvirt.live_migration_completion_timeout,其默认值为 800。例如,具有 8GiB 内存的共享存储实时迁移将在 6400 秒后超时。

  2. 实例停机时间

    在内存复制的最后阶段,实例会暂停一小段时间,以便在实例内存写入的干扰下复制剩余的几页。计算服务会将此时间初始化为一个小值,该值取决于实例大小,通常约为 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。

  3. 自动收敛

    成功迁移内存密集型实例的一种策略是减慢实例的速度。这称为自动收敛。libvirt 和 QEMU 都实现了此功能,通过在检测到内存复制延迟时自动限制实例的 CPU 来实现。

    默认情况下禁用自动收敛。您可以通过设置 live_migration_permit_auto_converge=true 来启用它。

    警告

    在启用自动收敛之前,请确保实例的应用程序可以容忍速度变慢。

    请注意,自动收敛不能保证实时迁移成功。

  4. 事后复制

    当您启用事后复制时,实时迁移内存密集型实例肯定会成功。此功能由 libvirt 和 QEMU 实现,它在将所有内存复制到目标主机之前激活目标主机上的虚拟机。当虚拟机访问目标主机上缺失的页面时,由此产生的页面错误通过从源主机复制页面来解决。

    默认情况下禁用事后复制。您可以通过设置 live_migration_permit_post_copy=true 来启用它。

    当您同时启用自动收敛和事后复制时,自动收敛将保持禁用状态。

    警告

    事后复制引入的页面错误可能会降低实例的速度。

    如果源主机和目标主机之间的网络连接中断,则无法再解决页面错误,并且实例将被重新启动。

    重要提示

    您可能需要在较新的内核上启用 unprivileged_userfaultfd 才能使事后复制工作。

    sysctl vm.unprivileged_userfaultfd=1
    

完整的实时迁移配置参数列表记录在 Nova 配置选项

VMware

vSphere 配置

通过遵循 KB 文章中的说明,在 Nova 管理的所有 ESX 主机上启用 vMotion。