支持 Cinder 卷多重挂载

https://blueprints.launchpad.net/nova/+spec/multi-attach-volume

目前,Nova 仅允许一个卷被附加到一个宿主机或实例。有时,用户可能希望能够将同一个卷附加到多个实例。

问题描述

目前,Nova 仅允许一个卷一次附加到一个实例或宿主机。Nova 在多个地方做出了假设,这些假设基于一个卷只能附加到一个实例的限制。

  • cinderclient 只有 volume 作为 detach() 调用中的参数。这假设一个卷只附加一次。

  • nova 假设如果一个卷已附加,则不能再次附加。参见 nova/volume/cinder.py: check_attach()

用例

允许用户使用读写或只读附件在多个客户机之间共享卷。具有两个节点的集群应用程序,其中一个处于活动状态,一个处于被动状态。两者都需要访问相同的卷,尽管只有其中一个处于活动访问状态。当活动节点发生故障时,被动节点可以快速接管并访问数据。

项目优先级

提议的变更

Nova 中需要的更改与附加和分离时间相关。

在附加时,Nova 必须移除它只能在卷“未被使用”的情况下才能附加它的假设。Cinder 卷现在可以在“可用”和/或“正在使用”的情况下被附加。Cinder 仅允许在卷创建时设置了“可共享”标志的情况下,将卷附加多次。

在分离时,Nova 需要向 cinderclient 传递一个新的参数,以告诉 cinder 要分离哪个特定的附加项。由于一个卷可以附加到实例和/或宿主机,因此在分离时添加一个新的附加 UUID。仅传递实例 UUID 是不够的。attachment_id 在 cinderclient 中将是可选的。如果未传递且存在多个附加项,则 cinder 将会失败,因为它不知道要分离哪个附加项。默认情况下,libvirt 假设所有磁盘都专用于单个来宾。如果您想在实例之间共享磁盘,则需要在配置该磁盘的来宾 XML 时告诉 libvirt。Libvirt 可以拒绝该请求以避免数据一致性问题,例如主机级别 I/O 缓存,我们需要使用 cache=none。

备选方案

唯一的替代方案是克隆一个卷并将其克隆附加到第二个实例。缺点是原始卷的任何更改都不会显示在挂载的克隆中。

数据模型影响

REST API 影响

安全影响

在 libvirt 驱动程序中,磁盘被赋予共享的 SELinux 标签,因此该磁盘不再具有强大的 sVirt SELinux 隔离。

通知影响

其他最终用户影响

命令行现在允许您调用 nova volume-attach 将一个卷附加到多个实例。

性能影响

其他部署者影响

开发人员影响

任何时候向 Nova 添加需要调用分离卷的新代码时,开发人员必须获取实例的卷附件 UUID。此信息嵌入在 cinder 卷的 volume_attachments 列表中。

实现

基于 Walter Boring 和 Charlie Zhou 的工作。同意 Walter 重新开始工作。

负责人

主要负责人

Tobias Engelbert

工作项

  1. 更新 cinderclient 的使用方式,以提取 Nova 获取卷时的新卷附件列表。

  2. 更新所有对 cinderclient.detach() 的调用,以包含 attachment uuid。

  3. Libvirt 卷驱动程序。

依赖项

测试

我们需要添加新的 Tempest 测试来支持新的 Cinder 卷可共享标志。新的 cinder 可共享标志决定了卷是否可以附加多次。需要研究一个 Tempest 测试,用于将同一个卷附加到多个实例。

文档影响

我们需要更新文档,讨论在 Cinder 可共享标志设置在卷上时,将卷附加到多个实例的新能力。

参考资料