将单个卷附加到多个宿主机

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 种方式更改。

  1. 可以在 create volume 操作中传递一个新的 multiattach 标志。

  2. 现有的 REST API 已经返回一个附件列表,即使只支持一个附件。现在,如果一个卷是 multiattach 启用的,附件可以返回多个条目。

  3. 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。

依赖项

测试

需要放置新的 tempest 测试来控制 multiattach。这项工作也在进行中。 https://review.openstack.org/#/c/153038/

文档影响

应更新文档以反映新的 API 更改以及在卷创建时使用的新 –allow-multiattach 标志。

参考资料