临时资源跟踪¶
https://blueprints.launchpad.net/cinder/+spec/temp-resources
改进 Cinder 的临时资源跟踪,以防止相关的配额问题。
问题描述¶
Cinder 目前没有一致的方式来跟踪临时资源,这导致了配额错误。
在某些情况下,临时卷使用 admin 元数据表中的 temporary 键来标记它们,而在其他情况下,我们根据卷的 migration_status 字段来确定卷是否为临时卷,甚至还有卷没有被标记为临时卷的情况。由于这种标记临时卷的迂回方式以及多种选项的存在,使得我们的 Cinder 代码容易出错,正如其中相关的错误数量所清楚地表明的那样。
对于临时快照,Cinder 目前没有任何可靠的方式来跟踪它们,因此创建临时资源的代码假定一切都会顺利进行,并且该方法中的删除代码将在成功完成操作后被调用。有时事实并非如此,因为操作可能会失败并留下临时资源,迫使用户手动删除它们,这会破坏配额,因为 REST API 删除调用不知道它不应该触碰配额。
当我们说我们没有可靠的方式来跟踪快照时,我们指的是即使快照具有帮助识别它们的名称,例如 [revert] volume %s backup snapshot 和 backup-snap-%s,这些也是用户可以分配的有效快照名称,因此我们不能依赖它们来区分临时快照。
用例¶
在以下几种情况下,此功能将非常有用
还原到快照配置为使用临时快照,但还原失败或临时卷的删除失败,因此用户最终手动删除快照,并且配额与实际情况保持同步。
在启用
backup_use_temp_snapshot时创建正在使用的卷的备份失败,或者临时资源的删除失败,迫使用户手动删除快照,并且用户希望配额与实际情况保持同步。驱动程序可能有一些缓慢的代码,由于性能原因在克隆或创建快照时被触发,但不适合临时卷执行。
提议的变更¶
建议的解决方案是在数据库中添加一个显式的字段,指示资源是否应计入配额。
该字段将命名为 use_quota,它将被添加到 volumes 和 snapshots 数据库表中。我们目前没有临时备份,因此不会向 backups 数据库表添加任何字段。
这将取代 temporary admin 元数据条目和 migration_status 条目,因为我们需要继续支持滚动升级,在滚动升级中,我们可能正在运行不知道新的 use_quota 字段的代码。
备选方案¶
另一种解决方案是在卷的 admin 元数据表中像我们现在做的那样使用 temporary 键,并为快照创建这样一个表。
使用该替代方案,数据库查询可能会变得更加复杂,而使用建议的解决方案,它们将变得更简单。
数据模型影响¶
在 volumes 和 snapshots 表中添加一个类型为 Boolean 的 use_quota 数据库字段。
它将具有在线数据迁移,以设置现有卷的 use_quota 字段,以及更新的 Volume 和 Snapshot OVO 的 save 方法,该方法在保存这些对象时设置此字段。
REST API 影响¶
将不会添加新的 REST API 端点,因为 use_quota 字段是一个内部字段,我们不希望用户或管理员修改它。
但是,由于这是有用的信息,我们将以更用户友好的名称 consumes_quota 将此字段添加到返回它的所有端点的卷的 JSON 响应中
创建卷
显示卷
更新卷
列出详细卷
创建快照
显示快照
更新快照
列出详细快照
安全影响¶
无。
Active/Active HA 影响¶
无,因为此更改主要影响在接收 REST API 删除请求时是否调用配额代码。
通知影响¶
无。
其他最终用户影响¶
该更改需要对 python-cinderclient 进行补丁,以显示新的返回字段 consumes_quota。
性能影响¶
此更改不应降低性能,因为该字段将在创建时添加,并且不需要额外的数据库查询。
此外,一旦我们删除了与当前临时卷检查的兼容性代码,就可以在未来提高性能,例如,不需要写入 admin 元数据表,直接在数据库上进行配额同步计算等。
其他部署者影响¶
无。
开发人员影响¶
默认情况下,卷和快照 OVO 在创建时将使用配额(将 use_quota 设置为 True),并且当开发人员想要创建不消耗创建或释放配额的临时资源时,需要在创建时传递 use_quota=False。
此外,在进行配额(添加或删除)时,新代码将需要检查卷和快照中的此字段。
不再需要添加额外的 admin 元数据或检查 migration_status,这应该使编码更容易并减少相关错误的数量。
实现¶
负责人¶
- 主要负责人
Gorka Eguileor (geguileo)
工作项¶
数据库模式更改。
数据库在线迁移和 OVO 更改。
更新将卷标记为临时资源的操作,以使用新的
use_quota字段。更新当前未将资源标记为临时资源的操作,以使用新的
use_quota字段执行此操作。REST API 更改,以将
use_quota字段作为consumes_quota返回。Cinderclient 更改。
依赖项¶
无。
测试¶
将不会添加新的 tempest 测试,因为我们想要修复的情况主要围绕着我们无法在 tempest 中强制执行的错误情况。
将提供单元测试,就像任何其他补丁一样。
文档影响¶
将更新 API 参考文档。
参考资料¶
建议的 Cinder 代码实现
建议的 python-cinderclient 代码实现
建议的代码,以利用 RBD 驱动程序中的此新功能,从而不展平临时资源