向卷中添加 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。
依赖项¶
测试¶
添加针对特定微版本的函数测试,并确保响应正确。
文档影响¶
记录详细卷响应中的新字段,并推荐如何使用它。或者直接参考此规范。