让 live-migration API 更友好¶
https://blueprints.launchpad.net/nova/+spec/making-live-migration-api-friendly
当前的 live-migration API 使用起来比较困难,因此我们需要使 API 更加用户友好,并方便外部系统使用。
问题描述¶
当前的 live-migration API 要求用户使用 block_migration 标志指定是否应使用块迁移。块迁移要求源主机和目标主机不在共享存储上。不使用块迁移的 live-migration 要求源主机和目标主机位于相同的共享存储上。
这个标志存在两个问题
对于外部系统和云运营商来说,很难知道对于特定的目标主机应该使用哪个值。在用户指定 block_migration 标志的值之前,用户需要弄清楚源主机和目标主机是否位于相同的共享存储上。
当用户传递值为 None 的 host 标志时,调度器将为用户选择一个主机。如果调度器选择的目标主机与源主机位于相同的共享存储上,并且用户将 block_migration 指定为 True,则请求将失败。这意味着调度器不知道存储拓扑,因此无法选择合理的主机。
对于 host 标志,值为 None 表示调度器应选择一个主机。为了方便使用,‘host’ 标志可以可选。
disk_over_commit 标志是 libvirt 驱动程序特定的。如果值为 True,libvirt virt 驱动程序将检查镜像的虚拟大小与磁盘可用大小。如果值为 False,libvirt virt 驱动程序将检查镜像的实际大小与磁盘可用大小。Nova API 不应暴露任何特定的 hypervisor 细节。这个标志也让用户感到困惑,因为通常用户只想使用与调度器已经相同的资源使用策略。
用例¶
API 用户和外部系统可以使用 live-migration API,而无需手动确定 Nova 部署的存储拓扑。
API 用户应该能够让调度器选择目标主机。
用户不想知道是否需要磁盘过度承诺,Nova 应该只是做正确的事情。
提议的变更¶
将 block_migration 标志设置为支持 auto,当值为 auto 时,Nova 将检测源主机和目标主机是否位于共享存储上。如果它们位于共享存储上,live-migration 将不会执行块迁移。如果它们不在共享存储上,将执行块迁移。
删除 disk_over_commit 标志并从 libvirt virt 驱动程序中删除磁盘使用量检查。
备选方案¶
理想情况下,Live-migration API 将会持续改进。对于 block_migration 标志,有两种观点
当 block_migration 标志为 False 时,调度器将选择与原始主机位于共享存储上的主机。当值为 True 时,调度器将选择与原始主机不在共享存储上的主机。这需要 Nova 完成一些工作来跟踪共享存储,以使调度器选择正确的主机。
完全删除 block_migration 标志,API 行为始终是在一个存储池中迁移实例,这在大多数情况下是人们的选择。
无论如何,当此 BP 实施时,可以跟踪共享存储:https://blueprints.launchpad.net/nova/+spec/resource-providers 因此这将是未来的工作。
disk_over_commit 的逻辑与 ResourceTracker 进行资源计数的方式不匹配。理想情况下,我们应该让 ResourceTracker 消耗磁盘使用量,这将由另一个 bug 修复或提案完成。
数据模型影响¶
无
REST API 影响¶
block_migration 将支持 auto,disk_over_commit 标志将被删除,json-schema 如下
block_migration = {
'type': ['boolean', 'string', 'null'],
'enum': [True, 'True', 'TRUE', 'true', '1', 'ON', 'On', 'on',
'YES', 'Yes', 'yes',
False, 'False', 'FALSE', 'false', '0', 'OFF', 'Off', 'off',
'NO', 'No', 'no',
'auto'],
}
{
'type': 'object',
'properties': {
'os-migrateLive': {
'type': 'object',
'properties': {
'block_migration': block_migration,
'host': host,
},
'required': ['block_migration', 'host'],
'additionalProperties': False,
},
},
'required': ['os-migrateLive'],
'additionalProperties': False,
}
此更改需要一个新的微版本,旧版本 API 将保持与之前相同的行为。
对于升级,如果用户指定使用旧版本节点和新 API 版本的 host,当 block_migration 为 auto 或未提供 disk_over_commit 时,API 将返回 HTTP BadRequest 400。如果用户未指定 host 并且选择了旧版本节点,调度器将重试查找另一个主机,直到找到新的计算节点或达到最大重试次数。
目前响应体为空,但用户需要迁移详细信息。可以通过将引用 URL 添加到响应头来获得这些详细信息,允许用户查询这些详细信息。
引用 URL 将类似于 /servers/{uuid}/migrations/{id}
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
用户不再需要在调用 live-migration API 之前弄清楚目标主机是否与源主机位于相同的共享存储上。但这可能会导致块迁移,从而给 live-migration 网络带来更大的负载,这可能会超出用户的预期。如果用户明确不想进行块迁移,用户可以显式地将 block_migration 设置为 False。这将在未来得到改进。
性能影响¶
无
其他部署者影响¶
新的 REST API 版本在滚动升级期间无法用于旧的计算节点。这是因为 disk_over_commit 已被删除,并且 block_migration 可以是 auto,这些值不再是 API 提供的有效值。用户只能使用旧版本的 live-migration API 和旧的计算节点。
开发人员影响¶
无
实现¶
检测 block_migration¶
对于 virt 驱动程序接口,有两个接口用于检查目标主机和源主机是否满足迁移条件。它们是 check_can_live_migrate_destination 和 check_can_live_migrate_source。检查之后,virt 驱动程序会将 migrate_data 返回给 nova conductor。
我们建议当使用 block_migration 设置为 None 时,这两个驱动程序接口将计算出 block_migration 的新值,基于 virt 驱动程序中实现的共享存储检查。 block_migration 的新值将在 migrate_data 中返回。
目前只有三个 virt 驱动程序实现 live-migration。它们是 libvirt 驱动程序、xenapi 驱动程序和 hyperv 驱动程序
对于 libvirt 驱动程序,它已经实现了共享存储的检测。检查结果在字典 dest_check_data 中,值为 is_shared_block_storage 和 is_shared_instance_path。因此,当 block_migration 为 None 时,驱动程序会将 block_migration 设置为 True 如果 is_shared_block_storage 或 is_shared_instance_path 为 True。否则,驱动程序会将 block_migration 设置为 False。最后,block_migration 的新值将在 migrate_data 中返回。
对于 xenapi 驱动程序,共享存储检查基于 aggregate。要求目标主机必须位于与源主机相同的 aggregate / hypervisor_pool 中。因此,当主机位于该 aggregate 中时,block_migration 将为 True。否则,block_migration 为 False。同样通过 migrate_data 返回新值。
对于 hyperv 驱动程序,虽然它支持 live-migration,但没有代码实现 block_migration 标志。因此,在 hyperv 支持该标志之前,我们不会实现它。
删除 disk_over_commit 的检查¶
disk_over_commit 标志仍然需要与旧的微版本一起工作。对于此提案,当请求使用较新的微版本时,我们将添加一个 None 值。在 libvirt 驱动程序中,如果 disk_over_commit 的值为 None,驱动程序将不会执行任何磁盘使用量检查,否则检查将与之前相同。
升级问题¶
此提案将为 block_migration 添加新值 auto 并删除 disk_over_commit。当 openstack 集群正在进行滚动升级时,旧版本计算节点不知道这个新值。因此,在 Compute RPC API 中添加了一个检查。如果客户端无法发送新的 Compute RPC API,将返回错误。
负责人¶
- 主要负责人
Alex Xu <hejie.xu@intel.com>
工作项¶
在 libvirt 和 xenapi 驱动程序中实现 block_migration 值的检测。
实现当 disk_over_commit 值为 None 时跳过磁盘使用量检查
在 API 中支持 auto 的 block_migration,并删除 disk_over_commit 标志。
依赖项¶
无
测试¶
Nova 中的单元测试和功能测试
文档影响¶
在 API 参考中记录 API 更改:https://developer.openstack.org/api-ref-compute-v2.1.html
参考资料¶
无
历史¶
Mitaka: 引入