暴露自动收敛和后复制

https://blueprints.launchpad.net/nova/+spec/expose-auto-converge-post-copy

问题描述

目前,自动收敛和后复制只能通过配置启用/禁用,这在灵活性方面有所不足。如果对性能降低敏感的应用程序(某些科学计算应用程序可能对内存访问延迟更敏感)位于启用了这些选项的主机上,则实时迁移可能会导致应用程序引发错误。因此,用户希望控制在实时迁移期间是否启用/禁用自动收敛或后复制。

用例

  • 某些应用程序不希望因网络故障或后复制实时迁移期间的内存页访问故障而增加重启的风险。

  • 某些应用程序对性能敏感(例如某些科学计算应用程序);这些应用程序不希望自动收敛功能在实时迁移期间降低性能。

  • 某些应用程序希望避免重启风险和性能限制。如果在后复制实时迁移期间两个计算节点之间的网络中断,则实时迁移将失败,用户需要重置实例才能使其可用。因此,此类应用程序不希望在实时迁移期间同时使用这两个功能。

  • 针对上述问题,操作员希望控制单个实例在实时迁移期间是否启用自动收敛或后复制。但目前可以控制的最小单位是计算节点。

提议的变更

支持自动收敛和后复制需要 QEMU 版本 >= 2.5.0。自 Rocky 版本发布以来,QEMU 的最低要求版本为 2.5.0 [1]。因此,使用 libvirt 驱动器的所有计算节点都应支持这些功能。libvirt virDomainMigrateFlags 枚举 [2] 中包含标志

...
VIR_MIGRATE_AUTO_CONVERGE = 8192
VIR_MIGRATE_POSTCOPY = 32768
...

配置 live_migration_permit_auto_convergelive_migration_permit_post_copy 只能通过修改配置来影响虚拟机管理程序,而特性可以影响单个实例。

为了请求该功能(将实例调度到提供该功能的节点),我们建议定义两个新的特性。这些特性由 libvirt 驱动程序报告,无论配置如何

  • COMPUTE_MIGRATE_AUTO_CONVERGE

  • COMPUTE_MIGRATE_POST_COPY

引入两个新的 flavor extra specs

  • compute:live_migration_auto_converge=true/false

  • compute:live_migration_post_copy=true/false

并引入两个新的镜像属性

  • compute_live_migration_auto_converge=true/false

  • compute_live_migration_post_copy=true/false

使用这些属性,而不是要求操作员在特性上设置 required/forbidden。在调用 placement 之前,当 compute:live_migration_auto_converge=truecompute:live_migration_post_copy=true 时,我们将为 placement 请求添加对应功能的 required traits。当 compute:live_migration_auto_converge=falsecompute:live_migration_post_copy=false 时,我们不向 placement 请求添加任何内容。因此,我们仍然可以将实例调度到具有这些功能的宿主机上,但为该实例禁用这两个功能。我们在调度器中使用这些键来选择性地添加 required traits,以确保实例可以降落在能够实现请求行为的宿主机上。然后,libvirt 驱动程序将解释这些值以决定在实时迁移期间是否使用这些功能。例如,如果 flavor 说 “false”

  • 我们不会将特性添加到调度请求中,因此实例可以降落在任何地方。

  • 驱动程序将使用该功能进行实时迁移,无论计算节点的配置如何。

默认情况下,当操作员创建不包含任何相关元数据的实例时,调度器不会关心宿主机是否支持自动收敛或后复制。如果配置 live_migration_permit_auto_convergelive_migration_permit_post_copy 为 True,则 libvirt 驱动程序将优先使用自动收敛或后复制。这些可以在操作员希望给定计算节点上的所有实例使用自动收敛/后复制时使用。例如

  • 如果已请求相关元数据的实例被调度到启用了 live_migration_permit_auto_convergelive_migration_permit_post_copy 的宿主机,则 libvirt 将尝试在实时迁移期间使用自动收敛或后复制。

如果操作员使用 compute:live_migration_auto_converge`=true/falsecompute:live_migration_post_copy=true/false 创建实例,这些元数据将覆盖配置:live_migration_permit_auto_convergelive_migration_permit_post_copy

compute:live_migration_auto_convergecompute_live_migration_post_copy 都为 true 或 flavor extra specs 与镜像属性冲突时,'create' API 调用将引发异常。

在使用自动收敛进行实时迁移时,如果操作员调用 force complete API,libvirt 将不会转换为使用后复制,因为它在 flavor extra specs 或镜像属性中不需要。

根据此规范 [3],如果在实时迁移期间启用了后复制,则 libvirt 驱动程序将拒绝 abort API 调用。现在我们可以通过检查 hw_live_migration_permit_reboot_risk 属性在 API 中拒绝请求。

备选方案

另一种方法是在 flavor extra_specs/镜像属性中使用特性。当操作员需要自动收敛/后复制时,这可以很好地工作。但它不能用于禁用自动收敛/后复制。自 Rocky 版本发布以来,所有 libvirt 虚拟机管理程序宿主机都支持自动收敛/后复制,这意味着每个 libvirt 虚拟机管理程序宿主机都将具有特性 COMPUTE_MIGRATE_AUTO_CONVERGECOMPUTE_MIGRATE_POST_COPY。如果操作员不想使用自动收敛或后复制,他们将使用 forbidden traits:traits:COMPUTE_MIGRATE_AUTO_CONVERGE=forbiddentraits:COMPUTE_MIGRATE_POST_COPY=forbidden。这意味着不要将我的虚拟机调度到支持自动收敛/后复制的宿主机,如上所述,这意味着所有 libvirt 计算节点都将被忽略。结果将是虚拟机创建失败,因为无法调度计算节点。

数据模型影响

将这两个镜像属性添加到 ImageMeta 对象

  • compute_live_migration_auto_converge

  • compute_live_migration_post_copy

ImageMeta 存储在 instance_system_metadata 表中,不需要模式修改。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

Ya Wang

工作项

  • 支持新的 placement 特性。

  • Libvirt 驱动程序更改为将特性报告给 placement,这些特性将由 libvirt 驱动程序作为 update_provider_tree 的一部分报告给 placement。这不会添加到所有 virt 驱动程序继承的通用计算功能字典中,因为这些特性是 libvirt 特定的。

  • 调度器更改为将元数据转换为特性。

  • 在 libvirt 驱动程序中,在实时迁移开始之前重新计算 _live_migration_flags

  • 添加功能测试和单元测试。

依赖项

测试

将包含单元测试和功能测试来测试新功能。

文档影响

  • 应更改实时迁移文档以介绍此新功能。

参考资料

历史

修订

发布名称

描述

Train

引入