Live-migrate instances

Live-迁移一个实例意味着在实例继续运行的同时,将其虚拟机移动到不同的 OpenStack Compute 服务器。在开始 live-迁移之前,请查看章节 配置 live 迁移。它涵盖了启用 live-迁移所需的配置设置,以及迁移和非 live-迁移选项的原因。

以下说明涵盖了共享存储和 volume-backed 迁移。要 block-迁移实例,请将命令行选项 -block-migrate 添加到 nova live-migration 命令,并将 --block-migration 添加到 openstack server migrate 命令。

手动选择目标主机

  1. 获取您要迁移的实例的 ID

    $ openstack server list
    
    +--------------------------------------+------+--------+-----------------+------------+
    | ID                                   | Name | Status | Networks        | Image Name |
    +--------------------------------------+------+--------+-----------------+------------+
    | d1df1b5a-70c4-4fed-98b7-423362f2c47c | vm1  | ACTIVE | private=a.b.c.d | ...        |
    | d693db9e-a7cf-45ef-a7c9-b3ecb5f22645 | vm2  | ACTIVE | private=e.f.g.h | ...        |
    +--------------------------------------+------+--------+-----------------+------------+
    
  2. 确定实例当前正在哪个主机上运行。在此示例中,vm1 正在 HostB 上运行

    $ openstack server show d1df1b5a-70c4-4fed-98b7-423362f2c47c
    
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | ...                  | ...                                  |
    | OS-EXT-SRV-ATTR:host | HostB                                |
    | ...                  | ...                                  |
    | addresses            | a.b.c.d                              |
    | flavor               | m1.tiny                              |
    | id                   | d1df1b5a-70c4-4fed-98b7-423362f2c47c |
    | name                 | vm1                                  |
    | status               | ACTIVE                               |
    | ...                  | ...                                  |
    +----------------------+--------------------------------------+
    
  3. 选择实例将迁移到的计算节点。在此示例中,我们将实例迁移到 HostC,因为 nova-compute 在其上运行

    $ openstack compute service list
    
    +----+------------------+-------+----------+---------+-------+----------------------------+
    | ID | Binary           | Host  | Zone     | Status  | State | Updated At                 |
    +----+------------------+-------+----------+---------+-------+----------------------------+
    |  3 | nova-conductor   | HostA | internal | enabled | up    | 2017-02-18T09:42:29.000000 |
    |  4 | nova-scheduler   | HostA | internal | enabled | up    | 2017-02-18T09:42:26.000000 |
    |  5 | nova-compute     | HostB | nova     | enabled | up    | 2017-02-18T09:42:29.000000 |
    |  6 | nova-compute     | HostC | nova     | enabled | up    | 2017-02-18T09:42:29.000000 |
    +----+------------------+-------+----------+---------+-------+----------------------------+
    
  4. 检查 HostC 是否有足够的资源进行迁移

    $ openstack host show HostC
    
    +-------+------------+-----+-----------+---------+
    | Host  | Project    | CPU | Memory MB | Disk GB |
    +-------+------------+-----+-----------+---------+
    | HostC | (total)    |  16 |     32232 |     878 |
    | HostC | (used_now) |  22 |     21284 |     422 |
    | HostC | (used_max) |  22 |     21284 |     422 |
    | HostC | p1         |  22 |     21284 |     422 |
    | HostC | p2         |  22 |     21284 |     422 |
    +-------+------------+-----+-----------+---------+
    
    • cpu: CPU 数量

    • memory_mb: 总内存量,单位为 MB

    • disk_gb: NOVA-INST-DIR/instances 的总空间量,单位为 GB

    在此表中,第一行显示物理服务器上可用的总资源量。第二行显示当前使用的资源。第三行显示最大使用的资源。第四行及以下显示每个项目可用的资源。

  5. 迁移实例

    $ openstack server migrate d1df1b5a-70c4-4fed-98b7-423362f2c47c --live-migration --host HostC
    
  6. 确认实例已成功迁移

    $ openstack server show d1df1b5a-70c4-4fed-98b7-423362f2c47c
    
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | ...                  | ...                                  |
    | OS-EXT-SRV-ATTR:host | HostC                                |
    | ...                  | ...                                  |
    +----------------------+--------------------------------------+
    

    如果实例仍然在 HostB 上运行,则迁移失败。控制器上的 nova-schedulernova-conductor 日志文件以及源计算主机上的 nova-compute 日志文件可以帮助确定问题。

自动选择目标主机

要将目标主机的选择交给 Compute 服务,请使用 nova 命令行客户端。

  1. 按照“手动选择目标主机”部分第 1 步中的说明获取实例 ID。

  2. 省略主机选择步骤 2、3 和 4。

  3. 迁移实例

    $ nova live-migration d1df1b5a-70c4-4fed-98b7-423362f2c47c
    

监控迁移

  1. 确认实例正在迁移

    $ openstack server show d1df1b5a-70c4-4fed-98b7-423362f2c47c
    
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | ...                  | ...                                  |
    | status               | MIGRATING                            |
    | ...                  | ...                                  |
    +----------------------+--------------------------------------+
    
  2. 检查进度

    使用 nova 命令行客户端获取 nova 的迁移监控功能。首先,获取迁移 ID

    $ nova server-migration-list d1df1b5a-70c4-4fed-98b7-423362f2c47c
    +----+-------------+-----------  (...)
    | Id | Source Node | Dest Node | (...)
    +----+-------------+-----------+ (...)
    | 2  | -           | -         | (...)
    +----+-------------+-----------+ (...)
    

    为了便于阅读,已删除大多数输出列。只有第一列,Id,是相关的。在此示例中,迁移 ID 为 2。使用此 ID 获取迁移状态。

    $ nova server-migration-show d1df1b5a-70c4-4fed-98b7-423362f2c47c 2
    +------------------------+--------------------------------------+
    | Property               | Value                                |
    +------------------------+--------------------------------------+
    | created_at             | 2017-03-08T02:53:06.000000           |
    | dest_compute           | controller                           |
    | dest_host              | -                                    |
    | dest_node              | -                                    |
    | disk_processed_bytes   | 0                                    |
    | disk_remaining_bytes   | 0                                    |
    | disk_total_bytes       | 0                                    |
    | id                     | 2                                    |
    | memory_processed_bytes | 65502513                             |
    | memory_remaining_bytes | 786427904                            |
    | memory_total_bytes     | 1091379200                           |
    | server_uuid            | d1df1b5a-70c4-4fed-98b7-423362f2c47c |
    | source_compute         | compute2                             |
    | source_node            | -                                    |
    | status                 | running                              |
    | updated_at             | 2017-03-08T02:53:47.000000           |
    +------------------------+--------------------------------------+
    

    输出显示迁移正在运行。进度是通过剩余要复制的内存字节数来衡量的。如果此数字随着时间的推移没有减少,则迁移可能无法完成,并且可能会被 Compute 服务中止。

    注意

    即使在 block 迁移的情况下,该命令也报告没有处理任何磁盘字节。

当迁移超时时该怎么办

在迁移过程中,实例可能会在页面被复制到目标主机后写入内存页面。当发生这种情况时,相同的页面必须再次复制。实例写入内存页面的速度可能快于它们可以被复制的速度,因此迁移无法完成。有两种可选的操作,由 libvirt.live_migration_timeout_action 控制,可以在达到 libvirt.live_migration_completion_timeout 后对 VM 采取的操作

  1. abort (默认): 在达到完成超时后,将取消 live 迁移操作。这类似于使用 API DELETE /servers/{server_id}/migrations/{migration_id}

  2. force_complete: Compute 服务将根据是否启用和可用 post-copy(libvirt.live_migration_permit_post_copy 设置为 True)暂停 VM 或触发 post-copy。这类似于使用 API POST /servers/{server_id}/migrations/{migration_id}/action (force_complete)

您可以阅读 libvirt.live_migration_timeout_action 配置选项的帮助以获取更多详细信息。

以下说明假定 KVM/Libvirt hypervisor。

如何知道迁移超时

要确定迁移超时,请检查源主机上的 nova-compute 日志文件。以下日志条目显示迁移超时

# grep WARNING.*d1df1b5a-70c4-4fed-98b7-423362f2c47c /var/log/nova/nova-compute.log
...
WARNING nova.virt.libvirt.migration [req-...] [instance: ...]
live migration not completed after 1800 sec

解决迁移超时

为了停止迁移对网络和磁盘等基础设施资源造成负载,您可以选择手动取消它。

$ nova live-migration-abort INSTANCE_ID MIGRATION_ID

要使 live-迁移成功,您有几个选项

  • 手动强制完成迁移

    $ nova live-migration-force-complete INSTANCE_ID MIGRATION_ID
    

    实例将暂停,直到内存复制完成。

    警告

    由于暂停会影响实例上的时间保持,并且并非所有应用程序都能容忍不正确的时间设置,因此请谨慎使用此方法。

  • 启用自动收敛

    自动收敛是 Libvirt 功能。Libvirt 检测到迁移可能无法完成,并减慢其 CPU 速度,直到内存复制过程快于实例的内存写入速度。

    要启用自动收敛,请在 nova.conf 中设置 live_migration_permit_auto_converge=true 并重新启动 nova-compute。在所有计算主机上执行此操作。

    警告

    自动收敛的一个潜在缺点是会降低实例的速度。

  • 启用 post-copy

    这是 Libvirt 功能。Libvirt 检测到迁移没有进展,并响应在所有内存都已复制到目标主机之前激活目标主机上的虚拟机。访问缺失的内存页面会导致从源主机满足的页面错误。

    要启用 post-copy,请在 nova.conf 中设置 live_migration_permit_post_copy=true 并重新启动 nova-compute。在所有计算主机上执行此操作。

    启用 post-copy 后,手动强制完成不会暂停实例,而是切换到 post-copy 过程。

    警告

    可能的缺点

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

    • Post-copy 可能会导致迁移期间页面错误率增加,从而降低实例的速度。

如果 live 迁移经常因用户令牌超时而在清理操作期间超时或失败,请考虑配置 nova 以使用 服务用户令牌