支持 Cinder 卷多重挂载¶
https://blueprints.launchpad.net/nova/+spec/multi-attach-volume
目前,Cinder 仅允许一个卷被挂载到单个主机或实例。有时,用户可能希望能够将同一个卷挂载到多个实例。
问题描述¶
目前,Cinder 仅允许一个卷一次挂载到一个实例或主机上。Nova 在多个地方做出了假设,这些假设基于卷只能挂载到一个实例的限制。
cinderclient 只有 volume 作为 detach() 调用中的参数。这假设一个卷只附加一次。
nova 假设如果一个卷已附加,则不能再次附加。参见 nova/volume/cinder.py: check_attach()
用例¶
允许用户使用读写或只读挂载方式在多个虚拟机之间共享卷。例如,具有两个节点的集群应用,其中一个节点是活动的,另一个是被动的。两者都需要访问同一个卷,尽管只有其中一个节点处于活动状态。当活动节点发生故障时,被动节点可以快速接管并访问数据。
项目优先级¶
提议的变更¶
Nova 中需要的更改与挂载和卸载时间相关。
在挂载时,Nova 必须移除它只能在卷“未被使用”的情况下挂载卷的假设。现在,如果卷的“shareable”(可共享)标志在创建时设置,则 Cinder 卷可以在“available”(可用)和/或“in-use”(正在使用)状态下被挂载。Cinder 仅允许将卷挂载多次,如果该卷在创建时设置了“shareable”标志。
在卸载时,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 shareable 标志。新的 cinder shareable 标志决定了卷是否可以挂载多次。需要研究一个 Tempest 测试,用于将同一个卷挂载到多个实例。
文档影响¶
我们需要更新文档,讨论在 Cinder shareable 标志设置为卷上的情况下,将卷挂载到多个实例的新能力。
参考资料¶
这是 Cinder wiki 页面,讨论了 multi-attach 的方法 https://wiki.openstack.org/wiki/Cinder/blueprints/multi-attach-volume