异步卷挂载¶
https://blueprints.launchpad.net/nova/+spec/async-volume-attachments
Nova 当前提供一个 attach-volume API 调用,它会阻塞多个 RPC 调用到计算服务。这些阻塞调用的原因主要是历史原因,与我们过去支持的需要与客户机进行更多直接交互的 hypervisor 相关,因此可以预测/预留/识别将在客户机中使用的块设备名称。
问题描述¶
在 eventlet(或任何绿线程方案)中,阻塞请求的开销不会太大,因为请求处理程序能够在等待期间处理其他连接。但是,在像 WSGI 这样的环境中,每个请求都在真实的线程或进程中处理,阻塞请求的开销要大得多。
attach volume API 就是其中一个阻塞 API,当前涉及 API 等待 reserve-block-device RPC 调用完成。如果计算服务总体上繁忙,或者要挂载的实例上正在运行某个操作,则往返计算服务的调用可能会很慢,因为预留块设备名称需要实例范围内的锁。
不幸的是,这对于我们当前支持的两个主要的 hypervisor 驱动程序(libvirt 和 vmware)来说有些毫无意义,因为它们无法预测或报告将在客户机中使用的块设备。因此,我们正在 API 中等待,消耗线程和连接,获取反正无用的信息。
在 WSGI 模式下(我们正在努力让用户迁移到该模式,以便弃用和删除 eventlet 模式),据报告这会造成相当大的问题,因为缓慢(或多个并行)的卷挂载请求会消耗所有可用的请求工作进程,从而导致类似 DoS 的情况。此外,恶意用户可以利用这种行为故意拒绝或降低服务质量。
用例¶
作为操作员,我希望能够以 WSGI 模式部署 nova-api,而不会因为缓慢的卷操作导致资源消耗问题。
作为操作员,我希望后端存储的问题不会导致 nova-api 服务耗尽请求资源。
提议的变更¶
本规范建议引入一个新的微版本,其中 attach-volume 调用将是异步的,并返回 202 而不是 200。我们将把当前的 attach-volume 工作流程委托给 conductor 任务 API,并根据使用的微版本进行 cast 或 call。在异步情况下,用户可以通过从实例的 volume-attachments 中检索它来获取同步 API 调用将返回的预期块设备名称。与之前一样,用户需要通过等待 Cinder 中卷的状态更改为 in-use 来轮询挂载完成情况。
当前 compute/api.py 中的 _attach_volume() 方法将被移动到 conductor 任务 API,可以通过 RPC 访问。API 将对旧的微版本进行此委托调用到 conductor,并对新的微版本进行 cast,并在每种情况下返回适当的内容和响应代码。
注意
还存在一个 shelved_offloaded 状态的挂载工作流程,必须加以考虑。它与 cinder 通信,因此可能是与主工作流程一起移动的候选对象,但它今天都在 API 中发生,因此也可能只是将其保留原样。
备选方案¶
过去曾提出一种替代方案(参见 之前的规范),它重新设计了更多的挂载工作流程,并使用 placement 中宣传的 traits 来控制使用哪种行为。在我看来,这过于复杂,同时也需要一个新的微版本和 RPC 行为。
数据模型影响¶
无。
REST API 影响¶
这将引入一个新的微版本,使 attach-volume API 异步化。
安全影响¶
当前行为在一定程度上存在 DoS 机会,尤其是在 API 以 WSGI 模式运行时。这将消除这种可能性。
通知影响¶
没有其他任何内容,除了通知当前在 API 调用返回之前发出,并且在此更改中它将在之后发生。由于发出 attach 调用的用户通常不是通知的消费者,因此不太可能注意到或引起任何问题。
其他最终用户影响¶
当前依赖 attach-volume API 返回客户机中预期设备名称的最终用户将不得不从 os-volume_attachments API 单独检索该信息。这可能需要轮询或等待卷挂载完成,因为在 attach-volume API 调用完成后,该信息将不可立即获得。
性能影响¶
这项工作是为了解决在 WSGI 模式下耗尽资源的性能影响。这项工作将解决该问题,并通常提高性能,因为异步操作在整个过程中需要更少的资源。
其他部署者影响¶
无。
开发人员影响¶
无。
升级影响¶
这种方法的一个好处是计算服务和 RPC API 无需更改。因此,conductor 与 API 协同升级(已经锁定步)意味着旧的计算节点在使用新的 API 之前完成升级时不会察觉到任何变化。
实现¶
负责人¶
- 主要负责人
jkulik
- 其他贡献者
danms
功能联络人¶
这项工作与 eventlet 弃用工作相关,因此应被视为解决因更改我们允许的唯一可用部署模型而产生问题的并行工作。
工作项¶
将 _attach_volume() 方法移动到任务 API,在那里可以调用它
为 conductor 任务 API 添加一个新的 cast/call RPC 接口,以执行挂载工作流程
为 API 添加一个新的微版本,以控制挂载工作流程是否异步
为新的微版本添加 tempest 覆盖
依赖项¶
这项工作没有直接依赖项,尽管它可能对 eventlet 弃用工作产生一些影响或关联。
测试¶
典型的功能和单元测试足以完成这项工作。现有的 tempest 测试应该可以很容易地更新为调用新的微版本,验证返回代码并轮询完成情况。
文档影响¶
典型的 api-ref 文档足以完成这项工作,以及发布说明,因为这可能对当前正在遭受资源耗尽问题的操作员感兴趣。
参考资料¶
历史¶
可选部分,旨在每次更新规范时使用,以描述新的设计、API 或任何数据库模式更新。有助于让读者了解随着时间的推移发生了什么。
发布名称 |
描述 |
|---|---|
2026.1 G |
引入 |