将单个卷附加到多个宿主机¶
https://blueprints.launchpad.net/cinder/+spec/multi-attach-volume
目前,Cinder 仅允许将一个卷附加到一个宿主机或实例。有时,用户可能希望能够将同一个卷附加到多个实例。
问题描述¶
目前,Cinder 仅允许一次将一个卷附加到一个实例和/或宿主机。Nova 在许多地方都做出了假设,这些假设依赖于单个卷只能附加到一个实例的限制。
cinderclient 只有 volume 作为 detach() 调用中的参数。这假设一个卷只附加一次。
nova 假设如果一个卷已附加,则不能再次附加。参见 nova/volume/cinder.py: check_attach()
用例¶
允许用户使用读写或只读附件在多个客户机之间共享卷。具有两个节点的集群应用程序,其中一个处于活动状态,一个处于被动状态。两者都需要访问相同的卷,尽管只有其中一个处于活动访问状态。当活动节点发生故障时,被动节点可以快速接管并访问数据。
提议的变更¶
为了启用将卷附加到多个宿主机或实例的能力,首先我们需要一个新的 volume_attachment 表,该表跟踪 cinder 卷的每个附件。我们将迁移 volume 表中的现有列(attached_host、instance_uuid、mountpoint、attach_time、attach_mode)。volume_attachment 表将有一个 id(称为 attachment_id),用于跟踪每个卷的单个附件记录。API 调用中返回的现有 cinder 卷对象包含一个附件列表。此附件列表现在也将包含每个附件的 attachment_id。
该 attachment_id 是 nova 在 detach API 调用期间传递给 cinder 的内容,以便 cinder 知道要分离哪个附件。cinder API 将支持默认 attachment_id 为 None,这将尝试进行分离,如果只有一个附件。
如果 cinder 没有收到 attachment_id,并且卷只有一个附件,那么分离将起作用。如果卷有多个附件,那么 cinder 将返回一个错误,说明卷有多个附件,需要 attachment_id。
volume 表将被更新,以包含一个名为“multiattach”的新列,这是一个布尔标志,用于指示 cinder 卷是否可以/不能多次附加。cinder API 和 cinderclient 将被更新以支持在卷附加时设置 multiattach 标志。我们也可以添加支持更新卷记录以启用 multiattach 标志,或者作为后续补丁。
备选方案¶
唯一的替代方案是克隆一个卷并将其附加到第二个实例。缺点是原始卷的任何更改不会显示在挂载的克隆中。
数据模型影响¶
volume 表将被修改以删除某些列,因为它们将被迁移到新的 volume_attachments 表。
将创建一个新的 volume_attachments 表来跟踪卷的所有附件。
所有现有的附件都将被迁移到新的模式。
REST API 影响¶
REST API 将以 2 种方式更改。
可以在 create volume 操作中传递一个新的 multiattach 标志。
现有的 REST API 已经返回一个附件列表,即使只支持一个附件。现在,如果一个卷是 multiattach 启用的,附件可以返回多个条目。
Detach 将接受一个可选的 attachment_id 来指定要尝试删除的附件。如果卷附加到多个宿主机或实例,并且未传递 attachment_id,则 API 将引发异常。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
在列出卷时,multiattach 标志将从命令行客户端显示。
此外,命令行客户端将包含一个可选的 –allow-multiattach 到 cinder create。默认情况下 multiattach 为 False
性能影响¶
一个可能的性能影响是在卷获取时对 volume_attachment 表的额外获取。这是一个简单的外键表连接,已建立索引。
其他部署者影响¶
无
开发人员影响¶
卷驱动程序开发人员应确保他们的卷附加到多个实例。我们应该对驱动程序进行后续补丁,以添加一个报告“multiattach”功能的补丁。我们可以更新调度器以过滤掉无法执行 multiattach 的后端。
实现¶
负责人¶
- 主要负责人
walter-boring (walter.boring@hp.com)
工作项¶
Cinder 需要更新以支持新的 API 更改并支持多次导出卷。
Cinderclient 需要更新以支持在创建时使用新的 multiattach 标志。
Cinderclient 需要更新以支持在分离卷时传递新的 attachment_id。
依赖项¶
支持此所需的 nova-spec 已经获得批准。 https://github.com/openstack/nova-specs/blob/master/specs/kilo/approved/multi-attach-volume.rst
测试¶
需要放置新的 tempest 测试来控制 multiattach。这项工作也在进行中。 https://review.openstack.org/#/c/153038/
文档影响¶
应更新文档以反映新的 API 更改以及在卷创建时使用的新 –allow-multiattach 标志。
参考资料¶
所有受影响项目的蓝图 https://blueprints.launchpad.net/openstack/?searchtext=multi-attach-volume
Nova 测试更改:https://review.openstack.org/#/c/153038/
Cinder wiki 页面:https://wiki.openstack.org/wiki/Cinder/blueprints/multi-attach-volume
Horizon 工作:https://blueprints.launchpad.net/horizon/+spec/cinder-multi-attach-volume