自动化实时迁移完成策略

蓝图:https://blueprints.launchpad.net/nova/+spec/auto-live-migration-completion

有许多策略可以用来帮助实时迁移操作完成。根据操作者对实时迁移完成的重视程度,自动化使用这些策略是可取的。

问题描述

当操作者执行实时迁移时,需要监控它以确保其正在取得进展,并采取措施帮助其完成。这需要大量的人力,并且在云运营成本方面非常昂贵。如果实时迁移过程可以自动采取措施尝试完成迁移,那将是更好的选择。

用例

作为 OpenStack 云的运营商,我希望实时迁移尽可能地推进到完成,而无需操作者干预。

提议的变更

实时迁移处理将自动确定要使用的策略,如果实时迁移由于实例的内存访问或磁盘 I/O 速率而难以完成。

可用的选项如下

最大停机时间设置

为了执行从源实例到目标实例的切换,实时迁移过程需要暂停实例一小段时间。默认值为 500 毫秒,但可以在实时迁移过程中通过 libvirt API 调用进行调整。增加此值可能会使迁移完成。

自动收敛

此功能提供了一种减慢客户机执行速度的方法,以便实时迁移可以将脏内存页复制到目标并完成迁移。必须在实时迁移操作开始之前启用它。如果启用,实时迁移过程将首先将所有内存页复制到目标,然后逐步降低实例的 CPU 速度,直到完成迁移。

默认情况下,它最初会将 CPU 速度降低 30%,然后进一步降低 10% 的增量,直到实例实际上暂停。初始降低和增量大小可以在实时迁移过程中通过 libvirt API 进行调整。但是,这些 API 调用是实验性的,因此 nova 将不会使用它们。

仅当源计算节点上安装了 libvirt 版本 1.2.3 和 qemu 版本 1.6 时,才能使用自动收敛。将添加一个 nova 配置标志,称为 live_migration_permit_auto_converge。此标志可以具有以下值

no - 永远不要使用自动收敛。

yes - 如果可用且没有更好的迁移

策略可用时使用自动收敛。

事后复制

如果要在迁移开始时使用它,则必须在迁移开始之前启用事后复制。执行 libvirt API 调用以告知它切换。只有在源和目标计算节点上安装了 libvirt 版本 1.3.3 和 qemu 版本 2.5 时,才能使用事后复制。将添加一个 nova 配置标志,称为 live_migration_permit_post_copy。此标志可以具有以下值

no - 永远不要使用事后复制。

yes - 如果可用则使用事后复制。

Nova 将允许实时迁移过程首先将所有内存页复制到目标,然后再考虑切换到事后复制模式。切换到事后复制将导致目标上的实例变为活动状态,而不是源节点上的实例。然后,qemu 将开始从源拉取尚未更新到目标上的内存页。如果目标实例尝试访问尚未复制到目标的内存页,qemu 将从源获取该页。

使用事后复制会影响切换到事后复制模式后实例的性能。此外,一旦进入事后复制模式,如果迁移处理失败,则实例将崩溃并需要重新启动。

实时迁移策略

如果迁移未完成但已复制了大部分内存,则逐步增加切换期间允许的停机时间,直到迁移完成或达到配置的最大停机时间。

仅当 live_migration_permit_auto_converge 设置为“yes”且 live_migration_permit_post_copy 设置为 no 或由于使用的 libvirt 和 qemu 版本而不可用时,才会使用自动收敛。

如果可用,将根据需要使用事后复制来完成迁移。Nova 应该允许迁移在预复制模式下运行一个内存页复制迭代,然后它应该开始监控剩余数据高水位线。如果每个迭代剩余数据高水位线没有减少至少 10%,则表明实时迁移无法在合适的时间范围内完成。此时,Nova 将自动切换到事后复制模式。

如果可用且未启用事后复制,则将启用自动收敛功能。

强制完成实时迁移

对正在进行的实时迁移执行“live-migration-force-complete”操作可以将实例置于暂停(在 libvirt 术语中为暂停)状态,以便允许迁移完成。当迁移完成并切换到目标时,它将自动恢复。

建议当操作者执行 live-migration-force-complete 操作时,所采取的措施取决于是否可用事后复制功能。如果可用,即 live_migration_permit_post_copy 设置为“yes”并且受使用的 libvirt/qemu 版本支持,则将执行切换到事后复制模式,而不是暂停实例。但是,如果在完成第一次内存页复制迭代之前执行 live-migration-force-complete 操作,它将推迟切换到事后复制,直到完成第一次内存页复制迭代。将使用迁移内存计数器来确定是否已完成第一次内存复制周期。这可以通过比较已处理的内存和内存总数来实现。如果已处理的内存超过内存总数,则至少已完成一次完整的内存复制周期。

尝试在切换到事后复制后中止实时迁移将被拒绝。如果迁移已切换到事后复制模式,libvirt 将拒绝中止作业 API 调用。但是,当驱动程序发出切换到事后复制模式的请求时,它可以更新迁移状态以指示事后复制模式生效,即将其从“running”更新为“running (post-copy)”。“live-migration-abort”调用的 API 方法可以增强,以检查迁移状态以确保它不在事后复制模式中。如果切换到事后复制发生在 API 中的检查之后但在驱动程序执行中止之前,我们将依赖 libvirt 拒绝中止请求。

请注意,一旦执行了切换到事后复制的操作,就无法使用 live-migration-force-complete 来暂停实例。请注意,如果可用事后复制功能,则“live-migration-force-complete”操作将切换到事后复制,而不是尝试暂停实例,因此不应该出现问题,libvirt 将拒绝尝试将迁移操作切换到已经处于事后复制模式的迁移。如果 live_migration_permit_post_copy 标志在实时迁移操作期间更改(即,如果将来设置为可变,请参阅 https://review.openstack.org/#/c/280851/),则存在“live-migration-force-complete”操作将尝试暂停处于事后复制模式的实例的风险。可以通过“live-migration-force-complete”调用的 API 方法检查迁移状态来解决此问题,如上所述。如果切换到事后复制发生在 API 中的检查之后但在驱动程序执行暂停之前,则实例将被不必要地暂停,但这不会造成任何损害,因为源实例在切换到事后复制后将不会处于活动状态。

备选方案

一种替代方案是不这样做,让操作者来管理实时迁移。

另一种方法是通过 nova 配置标志启用或禁用迁移选项(例如事后复制、自动收敛和最大停机时间设置)。全局启用这些选项可能会导致客户抱怨实例性能和可用性,因为使用这些功能可能会对实例性能产生重大影响。

另一种方法是向操作者提供 API,以便他们在实时迁移之前和期间选择和调整这些设置。但是,不希望将驱动程序特定内容暴露给 Nova API。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

如果可用且已启用,则事后复制功能将改变 live-migration-force-complete 操作的影响。

性能影响

对 Nova 管理应用程序性能没有重大影响(即计算管理器)。但是,迁移对正在迁移的实例的影响将取决于使用的迁移策略。

其他部署者影响

操作者在执行影响 libvirt 或 qemu 的操作时需要小心,以确保他们不会对正在进行的操作(例如实时迁移)产生不利影响。

开发人员影响

实现

负责人

主要负责人:Paul Carlton (irc: paul-carlton2)

其他负责人:None

工作项

  • 更新实时迁移启动和监控代码。

依赖项

请参阅下面的参考资料。

测试

将根据需要添加单元测试。

文档影响

参考资料

使用 KVM 确保迁移完成的技术分析 https://www.berrange.com/posts/2016/05/12/analysis-of-techniques-for-ensuring-migration-completion-with-kvm/

历史

修订版

发布名称

描述

Newton

引入