支持 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
工作项¶
更新 cinderclient 的使用方式,以提取 Nova 获取卷时的新卷附件列表。
更新所有对 cinderclient.detach() 的调用,以包含 attachment uuid。
Libvirt 卷驱动程序。
依赖项¶
这需要一个新的 python-cinderclient 版本。客户端的更改包括新的分离 API。 https://blueprints.launchpad.net/python-cinderclient/+spec/multi-attach-volume
这还需要 cinder 中的一个补丁来支持附加到多个实例的能力。 https://blueprints.launchpad.net/cinder/+spec/multi-attach-volume
测试¶
我们需要添加新的 Tempest 测试来支持新的 Cinder 卷可共享标志。新的 cinder 可共享标志决定了卷是否可以附加多次。需要研究一个 Tempest 测试,用于将同一个卷附加到多个实例。
文档影响¶
我们需要更新文档,讨论在 Cinder 可共享标志设置在卷上时,将卷附加到多个实例的新能力。
参考资料¶
这是 Cinder wiki 页面,讨论了 multi-attach 的方法 https://wiki.openstack.org/wiki/Cinder/blueprints/multi-attach-volume