支持 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

工作项

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

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

  3. Libvirt 卷驱动程序。

依赖项

测试

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

文档影响

我们需要更新文档,讨论在 Cinder shareable 标志设置为卷上的情况下,将卷挂载到多个实例的新能力。

参考资料