每实例迁移超时

https://blueprints.launchpad.net/nova/+spec/live-migration-per-instance-timeout

为 live-migrate API 添加一个新的微版本,以便在给定超时后中止或强制完成任何 libvirt live-migration 操作。

问题描述

Nova 目前优化的是有限的客户机停机时间,而不是确保 live-migration 操作始终成功。这可能导致 Nova 中的 live-migration 看起来比其他云和服务器虚拟化系统提供的 live-migration менее “可靠”。

一个关键的观察是,客户机存活性和您愿意等待 live-migration 完成的时间之间的权衡对于每个实例以及对同一实例进行的每个 live-migration API 调用来说并不相同。如果失败的 live-migration 意味着客户机现在必须停留在您正在修补的主机上并重新启动,那么客户机的停机时间将比您在 live-migration 期间增加一点停机时间要长得多。

使用当前的 live-migrate API 和配置选项,操作员无法对每个实例的 live-migrate 操作进行细粒度控制。如果他们想以不同的方式处理任何特定实例的 live-migrate 操作,他们必须更改相关的配置值以更好地适应并重新启动计算服务,这使得 live-migration 体验非常糟糕。

鉴于最近删除了进度超时,我们与操作员讨论过他们希望自定义每个 live-migration 操作的超时时间。根据涉及的虚拟机以及不迁移虚拟机的成本,他们可以决定等待多长时间。以类似的方式,他们希望决定是否在超时后中止(避免虚拟机有比 libvirt.live_migration_downtime 更多的停机时间),或者强制 live-migration 移动(允许超过 libvirt.live_migration_downtime 的停机时间以确保虚拟机移动)。

如果我们赋予操作员设置每个 live-migration 操作的自定义超时时间的能力,这将与一些其他配置选项产生冲突。Nova 告诉 libvirt 仅允许 live-migration 在停机时间不超过 libvirt.live_migration_downtime 毫秒的情况下完成。为了进一步减少 live-migration 对客户机虚拟机的冲击,Nova 会缓慢增加允许的停机时间,直到达到该最大值。Nova 使用配置选项 libvirt.live_migration_downtime_stepslibvirt.live_migration_downtime_delay 来确定在达到 libvirt.live_migration_downtime 毫秒的允许虚拟机停机时间之前需要多长时间。目前,这些配置值必须小心更改,以匹配 libvirt.live_migration_completion_timeout 的值,这意味着不要花所有时间来增加停机时间,并且不要在完成超时到期之前允许足够的时间来移动虚拟机。如果允许操作员为每个 live-migration 操作指定自己的超时值,我们必须找到一种方法来调和这一点与在允许 live-migration 完成之前增加允许的停机时间逻辑。

用例

  • 操作员希望修补一个主机并希望将所有虚拟机从该主机迁移出去。在这种情况下,他们希望在达到超时时强制虚拟机移动,因为他们认为可能需要重新启动虚拟机的风险比暂停虚拟机以使其移动更不可接受。

  • 操作员希望将繁忙的虚拟机从一个主机迁移出去以平衡他们的集群。在这种情况下,他们希望能够灵活地启动 live-migration 操作,并可以选择在计时器到期时取消该操作。

提议的变更

为 Live-Migrate Server API 添加一个新的微版本,以添加对以下两个可选参数的支持

  • timeout_seconds - 可选参数,用于指定 Nova 在给定 live-migration 操作后采取行动的时间(以秒为单位)。这将覆盖配置选项 libvirt.live_migration_completion_timeout。请注意,与配置不同,这是一个绝对超时时间,而不是根据虚拟机大小进行缩放的超时时间。

  • on_timeout - 此可选参数可以设置为 force_completeabort。这将覆盖配置选项:libvirt.live_migration_action_on_timeout,默认值为 abort

为了帮助升级,对于包含任何新的超时参数且在所有计算节点都已升级到报告至少与此功能添加时间匹配的服务版本之前的任何请求,我们将返回 400。

为了解决 ramp up 时间的问题,我们建议花费指定的完成超时时间的一半来正常增加到最大停机时间。之后,我们将增加到 libvirt.live_migration_downtime。这将确保虚拟机将指定超时时间的一半时间用于最佳机会,让 live-migration 完成,而无需中止或强制完成。

备选方案

操作员可以调用 delete 迁移 API 来中止正在运行的 live-migration,或者调用 force-complete 来触发后复制或暂停正在 live-migration 的虚拟机。但是,这远非方便,并且可能导致在调用 force-complete 之前发生超时的情况。

我们还可以修改停机时间 ramp up 逻辑的其他方法有很多。鉴于对重新设计该逻辑的讨论,我们只是做最少的努力来确保在达到操作员指定的超时时间之前达到 libvirt.live_migration_downtime

数据模型影响

Migration 对象获取 live-migrate API 的两个新参数

  • timeout_seconds - 整数属性。

  • on_timeout - 枚举 ([“force_complete”, “abort”])。

REST API 影响

  • URL: POST /v2.1/servers/{server_id}/action

    JSON 请求体

    {
        "os-migrateLive": {
            "host": "target-host",
            "block_migration": "auto",
            "timeout_seconds": 60,
            "on_timeout": "force_complete"
        }
    }
    

一个新的微版本将引入到 os-migrateLive API,它将采用两个额外的可选参数 timeout_secondson_timeout

  • JSON 模式 for timeout_seconds

    {
        "timeout_seconds": {
            "type": "integer",
            "minimum": 0
        }
    }
    
  • JSON 模式 for on_timeout

    {
        "on_timeout": {
            "type": "string",
            "enum": [ "force_complete", "abort" ]
        }
    }
    

安全影响

通知影响

其他最终用户影响

在 python-novaclient 中添加对 API 的支持。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Sarafraj Singh (raj_singh)

其他贡献者

OSIC

工作项

  • 在 libvirt 中添加逻辑以利用这些新参数。

  • 添加 API 以暴露每个操作的强制超时和操作。

依赖项

我们首先需要添加默认超时操作的配置:https://blueprints.launchpad.net/nova/+spec/live-migration-force-after-timeout

测试

需要为新的 API 添加新的 tempest 测试。

研究虚拟机内部的繁忙工作负载,以测试 gate 的 live-migration 作业中的上述 API。

文档影响

需要使用新 API 的详细信息更新 api-ref。

还应更新 API 概念指南,以涵盖如何最好地使用带有我们添加的所有新 API 的 live-migration。

参考资料

历史

修订版

发布名称

描述

Pike

引入