提供中止正在进行的实时迁移

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

目前,取消实时迁移需要干预虚拟机监控程序。 本规范建议在实例对象上添加一项新操作,以取消该实例的实时迁移。

问题描述

操作员在启动实时迁移后,可能会决定取消它。 实际上,这意味着回滚任何已发生的迁移,并将实例保留在源节点上。 可能是迁移时间过长,或者发现目标节点存在一些操作问题。 由于在实时迁移期间可以对实例执行的操作有限(目前仅允许删除),因此实例所有者可能要求立即提供他们的实例。

目前中止实时迁移需要在虚拟机监控程序层面进行干预,Nova 会识别并重置实例状态。

用例

作为 OpenStack 云的运营商,我希望能够查询、停止和回滚正在进行的实时迁移。 这有许多原因。

  1. 迁移可能由于实例的工作负载而无法完成。 在某些情况下,解决此问题的方案可能是暂停实例,但在其他情况下,可能需要放弃或至少推迟迁移。

  2. 迁移可能对实例产生不利影响,例如,实例所有者可能会观察到应用程序性能下降,并要求云运营商解决此问题。

  3. 实例迁移可能由于要复制的数据量过大(例如,实例的临时磁盘已满)而花费时间过长,云运营商可能已与实例所有者协商并决定放弃实时迁移并采用不同的策略。 例如,停止实例,执行虚拟机监控程序维护,然后重新启动实例。

提议的变更

建议在实例对象上添加新的 API 操作,这些操作可用于获取实例迁移操作的详细信息并中止活动操作。 这将包括一个 GET 请求以获取迁移操作的详细信息。 如果实例不存在(或对正在使用的租户 ID 不可见),或者从未进行过任何迁移,则 GET 请求将返回 404 响应代码。 如果 GET 请求返回活动迁移的详细信息,则可以使用 DELETE 请求来中止迁移操作。 同样,如果实例不存在(例如,自 GET 请求以来已被删除),或者没有正在进行的迁移(即,自 GET 请求以来已结束),则 DELETE 请求将返回 404 响应代码。 否则,它将返回 202 响应代码。

回滚实时迁移应该非常快,因为源主机在迁移完成之前仍然处于活动状态。 但是,这取决于虚拟化驱动程序实施的方法。 例如,Qemu 计划实施“后期复制”功能 - https://#/archives/libvir-list/2014-December/msg00093.html 在这种情况下,应拒绝取消请求,因为回滚到源节点比完成迁移需要更多的工作。 事实上,这可能是不可能的! Nova 需要参与从预复制到后期复制的切换,以便它可以将网络切换到目标主机。 因此,Nova 将知道实例已切换,并拒绝任何取消请求。 如果实例迁移在后期复制期间遇到完成困难,则需要暂停实例以允许迁移完成。

GET /servers/{id}/migrations 操作将涉及 API 服务器验证实例的存在和任务状态。 如果实例不存在(或对调用此操作的用户不可见),将返回 404 响应代码。 否则,API 服务器将返回实例的所有正在运行的迁移操作的详细信息。 它将使用迁移类中的一个新方法,称为 get_by_instance_and_status,指定实例 UUID 和运行状态。 如果没有返回迁移对象,则 API 响应将返回一个空列表。 如果返回一个或多个迁移对象,则 new_instance_type_id 和 old_instance_type_id 字段将用于检索相关风味的 flavor 对象以获取 flavor ID。 这些值将包含在响应中,作为 new_flavor_id 和 old_flavor_id。 这意味着用户将能够使用此信息来获取风味的详细信息。

DELETE /servers/{id}/migrations/{id} 操作将涉及 API 服务器调用迁移类中的 migration_get 方法来验证实例上是否存在正在进行的实时迁移操作。 然后它将在 ServersController 类中调用一个名为 live_migrate_abort 的方法

如果调用用户没有执行该操作的权限(如 policy.json 文件中定义),则将返回 403 响应代码。 policy.json 文件将被更新,以将 live_migrate_abort 定义为仅可供云管理员用户访问。

如果 API 服务器确定操作可以继续,它将向计算管理器发送一个异步消息,并向用户返回 202 响应代码。

计算管理器将发出一个通知消息,指示 live_migrate_abort 操作已开始。 然后它将调用驱动程序中的一个方法来中止迁移。 如果驱动程序无法执行此操作,将返回一个新的异常,称为“AbortMigrationNotSupported”。

计算管理器调用的方法将包装有导致其生成实例操作和通知事件的装饰器。 这里生成的异常将由这些包装器处理,因此用户将能够查询实例操作以发现取消操作的结果。

请注意,实例任务状态将不会被 live_migrate_abort 操作更新。 如果操作员多次执行该操作,后续调用将简单地失败。

对于 libvirt 驱动程序,它将获取目标实例的 domain 对象,并对其调用 job abort。 如果没有活动作业,将返回错误。 这可能发生在实例迁移最近完成或完成 libvirt 迁移并执行后期迁移阶段之后。 它也可能发生在迁移仍在执行预迁移阶段时。 最后,如果 libvirt 作业失败但 Nova 没有更新任务状态,也可能发生这种情况。 在所有这些情况下,将向计算管理器返回一个异常,以指示操作不成功。

如果 libvirt job abort 操作成功,则执行实时迁移的线程将从 libvirt 驱动程序接收到错误,并执行实时迁移回滚步骤,包括重置实例的任务状态为 none。

备选方案

另一种选择是不这样做,让操作员卷起袖子在虚拟机监控程序上工作。

在 Nova 中之前就曾讨论过取消正在进行的实时迁移,并认为它适合于“任务 API”以管理长期运行的任务 [1]。 目前还没有任务 API,但如果将其添加到 Nova,它将是合适的。

数据模型影响

REST API 影响

将在新的微版本中添加。

  • 获取实例上状态为运行的实时迁移操作的详细信息。 此状态下的每个实例应该只有一个迁移,但 API 调用支持返回多个迁移。

    该操作将返回实例的活动迁移操作的 ID。

    GET /servers/{id}/migrations

Body

None

Normal http response code: `200 OK`

Body::

{
 "migrations": [
    {
      "created_at": "2013-10-29T13:42:02.000000",
      "dest_compute": "compute3",
      "id": 6789,
      "server_uuid": "6ff1c9bf-09f7-4ce3-a56f-fb46745f3770",
      "new_flavor_id": 2,
      "old_flavor_id": 1,
      "source_compute": "compute2",
      "status": "running",
      "updated_at": "2013-10-29T14:42:02.000000",
    }
  ]
}

Expected error http response code: `404 Not Found`
- the instance does not exist

Expected error http response code: `403 Forbidden`
- Policy violation if the caller is not granted access to
'os_compute_api:servers:migrations:index' in policy.json
  • 停止正在进行的实时迁移

    该操作会将实例任务状态重置为 none。

    DELETE /servers/{id}/migrations/{id}

Body

None

Normal http response code: `202 Accepted`
No response body is needed

Expected error http response code: `404 Not Found`
- the instance does not exist

Expected error http response code: `403 Forbidden`
- Policy violation if the caller is not granted access to
'os_compute_api:servers:migrations:delete' in policy.json

Expected error http response code: `400 Bad Request`
- the instance state is invalid for cancellation, i.e. the task
state is not 'migrating' or the migration is not in a running
state and the type is 'live-migration'

安全影响

通知影响

发出通知消息,指示迁移取消操作的开始和结果。

其他最终用户影响

将提供一个新的 python-novaclient 命令,例如:

nova live-migration-abort <实例>

性能影响

其他部署者影响

开发人员影响

实现

负责人

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

其他指派人:Claudiu Belu

工作项

  • python-novaclient ‘nova live-migration-abort’

  • 取消实时迁移 API 操作

  • 每个虚拟机监控程序的取消实时迁移 * libvirt * hyper-v * vmware

依赖项

测试

将添加使用假 virt 驱动程序模拟实时迁移的单元测试。 假驱动程序实现将简单地等待取消。 我们还想测试在预迁移或后期迁移期间取消迁移的尝试,这可以使用也将等待取消尝试指示的假实现来完成。

功能测试将利用新的实时迁移 CI 作业。 将使用具有内存活动和大型磁盘的实例,以便我们可以测试实时迁移的所有方面,包括中止实时迁移。

文档影响

需要记录新的 API

参考资料

有关如何使用 libvirt 执行此操作的一些详细信息:https://#/archives/libvirt-users/2014-January/msg00008.html

历史

修订

发布名称

描述

Mitaka

引入