向卷中添加 shared_targets 列

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/cinder/+spec/add-shared-targets-flag-to-volume

处理设备附加时的一个问题是,有些设备为多个卷共享单个目标,而另一些设备为每个卷都有单个唯一目标。

例如,使用共享目标的设备可能有一个 iSCSI 连接,该连接由附加到 Nova 计算节点的多个卷共享。

这可能很麻烦,因为消费者需要格外小心,以确保在发出删除/分离调用时,目标未被系统上的其他卷使用。

问题描述

目前,当 os-brick 收到分离操作时,它会尝试检查系统并确定是否有多个卷附加到主机,并共享相同目标。大多数情况下,这可以正常工作,但它容易出现竞争条件,此外,尝试总线扫描不仅效率低下而且不可靠。

另一个问题是,目前 os-brick 无法知道它是否正在处理使用共享目标的设备,因此即使不需要,我们也会执行此扫描例程。

如果我们可以提前知道卷是托管在利用共享目标的设备上,那么删除目标的过程将更加健壮,在这种情况下,我们可以更有效地执行操作,包括在特定后端上围绕附加/分离操作使用锁。

用例

这改进了正确有效地分离卷的现有用例。基本条件是,您有一个使用共享目标的设备,并且有一个卷 (V-A) 从该设备附加到计算节点。用户发出分离调用,同时另一个用户发出从同一后端附加不同卷 (V-B) 的调用,该卷将降落在同一计算节点上。

V-B 的连接响应可能是在假设目标存在的情况下完成的(由于 V-B),但 V-A 分离过程会在 V-B 的附加完成之前执行其检查,结果是它删除了目标,并且 V-B 的连接似乎已成功,但该卷将无法访问。

提议的变更

在卷引用中添加一个列,指示关联的后端是否使用共享目标,此外,在卷详细视图中添加一个后端名称成员。当 shared_targets 为 True 时,消费者将知道他们正在处理使用共享目标的设备,并且需要采取一些额外的预防措施。

此外,我们需要为后端提供一个唯一的标识符,同时又不向最终用户泄露抽象的细节。服务 UUID 应该可以很好地完成此操作。

对于使用单个设备来备份多个 c-vol 服务的情况,我们将提供在配置文件中覆盖/设置此标识符的能力。这样,管理员可以选择将多个 c-vol 配置设置为使用相同的 backend_id(如果需要)。

请注意,默认情况下,我们将 shared_targets 标志设置为 True。我们使用此默认值,因为将唯一目标视为共享目标不会造成任何危害或功能问题,只会引入一些不必要的锁定,但不会影响功能。相反,如果实际上使用共享目标的设备为 False 且未锁定,则在附加和分离调用之间存在竞争条件,从而导致问题。

备选方案

我们今天使用的扫描方法大多数情况下都有效且合理。我们可以只继续使用它。

数据模型影响

此更改在 Volumes 表中添加了一个新的布尔列 (shared_targets)。

  • 这将需要哪些新的数据对象和/或数据库模式更改?

    这在 Volumes 表中引入了一个新列

  • 哪些数据库迁移将伴随此更改。

    我们将执行一个 DB 迁移,该迁移将添加该列并将其值设置为 True。设置为 True 对于非共享目标是安全的,因此虽然这不一定是最高效的方法,但它是安全可靠的。

  • 如何生成初始的新数据对象,例如,如果您需要考虑现有卷,或修改其他现有数据,请描述其工作方式。

    在卷服务初始化期间,我们将查询后端的 capabilities 以获取“shared_targets”设置,如果 stats 结构中的值为 False,我们将检查所有设置为 True 的卷并相应地更新它们。这样我们迁移了所有内容并将其设置为 true,然后在服务初始化时验证设置是否正确。

    请注意,我们已经在初始化时迭代后端的卷,因此我们没有引入任何新的开销或延迟。

REST API 影响

此更改不会影响任何现有 API 调用的参数或选项,但是它会在 Volume Get 响应中添加额外的字段。

当选择适当的微版本时,我们将向详细的卷响应视图添加两个额外的字段

shared_targets backend_name

安全影响

通知影响

其他最终用户影响

此更改主要只是为用户提供更多信息。由用户/消费者决定是否要对这些额外信息做任何事情,但它不会更改他们当前的使用案例或工作流程。

性能影响

其他部署者影响

开发人员影响

默认情况下,我们将为卷设置 shared_targets 标志为 True,但驱动程序维护者应将其适当的 stats 字段添加到其驱动程序中,以更改此设置(如果他们不使用共享目标)。

实现

负责人

主要负责人

john-griffith

工作项

将更改添加到 Cinder 并提高 cinderclient 中的最大支持 MV。

依赖项

测试

添加针对特定微版本的函数测试,并确保响应正确。

文档影响

记录详细卷响应中的新字段,并推荐如何使用它。或者直接参考此规范。

参考资料