移除实时迁移中的计算节点间通信¶
https://blueprints.launchpad.net/nova/+spec/remove-compute-compute-communication
当前的实时迁移过程使用 nova 计算节点之间的直接 rpc 通信。这种通信混合了阻塞和非阻塞请求,因此存在超时和后续失败的可能性。
问题描述¶
现有的实时迁移过程允许计算节点在预迁移/后迁移/回滚以及实时迁移本身步骤期间相互通信。这个过程很复杂,容易出现各种潜在问题。实时迁移同时使用阻塞和非阻塞 rpc 请求,这可能导致在某个步骤尚未完成时发生超时,以及在异步 rpc 投递的情况下节点之间的竞争。上述问题的根本原因在于计算节点同时处理编排和实际执行实时迁移的逻辑。现有过程的另一个潜在问题是,后迁移阶段(后迁移/回滚)的方法可能永远无法执行,并且将无法确定所有步骤是否都已通过。这个问题也是由于编排过程和实际逻辑的混合造成的。当请求到达 conductor 时,将发生以下流程
check_can_live_migrate_destination - 从 conductor 到目标计算节点的阻塞 rpc 调用,用于检查计划迁移的可能性。在向 conductor 发送响应之前,目标节点会向源计算节点发送以下请求。
check_can_live_migrate_source - 从目标计算节点到源计算节点的阻塞 rpc 调用,用于检查计划迁移的可能性。
live_migration - 从 conductor 到源计算节点的非阻塞 rpc 投递,实际触发实时迁移。在源计算节点接收到请求并且在实时迁移实际开始之前,会向目标节点发送以下请求。
pre_live_migration - 从源计算节点到目标节点的阻塞 rpc 调用,用于为正在进行的迁移准备目标主机。
在上述步骤之后,可能会发生以下两种情况
实时迁移成功
实时迁移失败
如果成功,将发生以下流程
post_live_migration_at_destination - 从源计算节点到目标节点的非阻塞 rpc 投递,用于完成过程
如果失败
rollback_live_migration_at_destination - 从源计算节点到目标节点的非阻塞 rpc 投递,用于清理失败尝试后的资源
用例¶
主要用例是实时迁移过程。此更改对于部署者/最终用户而言是透明的。
提议的变更¶
重构现有的 rpc 通信,以消除计算节点之间的 rpc 请求。相反,让 conductor 来操作这个过程。
为了实现这一点,创建新的 rpc 方法
post_live_migration_at_source 在成功的情况下完成目标节点上的过程
rollback_live_migration_at_source - 在实时迁移失败的情况下清理节点。
以上所有 rpc 方法都应实现以下模式,又称轻量级 rpc 调用:客户端向服务发送阻塞 rpc 调用,一旦服务接收到请求,就会生成一个新的 greenlet 来处理它,并立即响应调用者。这种方法确保调用者已将请求传递给服务,并且不会阻塞调用者的执行流程。
在这种情况下,conductor 将负责在实时迁移之前完成所有准备和检查,以及回滚/后迁移操作。建议的流程
check_can_live_migrate_destination - 从 conductor 到目标计算节点的阻塞 rpc 调用,用于检查计划迁移的可能性。
check_can_live_migrate_source - 从 conductor 到源计算节点的阻塞 rpc 调用,用于检查计划迁移的可能性。
pre_live_migration - 从 conductor 到目标计算节点的阻塞 rpc 调用,用于为正在进行的迁移准备目标主机。
live_migration - 从 conductor 到源计算节点的非阻塞 rpc 投递,实际触发实时迁移
在上述步骤之后,可能会发生以下两种情况
实时迁移成功
实时迁移失败
如果成功,将发生以下流程
post_live_migration_at_source - 在迁移完成后从 conductor 到源计算节点的非阻塞 rpc 投递
post_live_migration_at_destination - 从 conductor 到目标计算节点的非阻塞 rpc 投递
如果失败
rollback_live_migration_at_source - 在失败尝试后从 conductor 到源计算节点的非阻塞 rpc 投递,用于清理资源
rollback_live_migration_at_destination - 从 conductor 到目标计算节点的非阻塞 rpc 投递,用于清理失败尝试后的资源。
提议的更改与现有流程之间的主要区别在于
在实时迁移之前的检查期间,不再是从 conductor 到目标计算节点的连续阻塞 rpc 调用,然后再从目标节点到源计算节点,而是从 conductor 到目标计算节点和从 conductor 到源计算节点的独立请求。因此,超时可能性将降低。此外,此更改将 conductor 设置为实时迁移过程的所有者。
pre_live_migration 首先完成,然后再调用 live_migration rpc 投递
conductor 管理实时迁移的后迁移/回滚。
备选方案¶
保持原样,不更改此通信。另一种选择是采用完全非阻塞的方法,使用一种状态机来在实时迁移期间的步骤之间切换。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
多个阻塞 rpc 调用被非阻塞请求取代
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
tdurakov
其他贡献者:rpodolyaka
工作项¶
重构现有代码,使其与新的 rpc 方法兼容
实现新的 rpc 方法
依赖项¶
无
测试¶
标准的单元测试覆盖率,升级兼容性测试
文档影响¶
无
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Newton |
引入 |