Nova/QuotaKeyValueSpec
- Launchpad 条目:NovaSpec:nova-quota-schema
- 创建时间:2011年5月8日
- 贡献者:Mark Washenberger
总结
目前 nova 数据库中的 quota 表为我们管理的每种 quota 类型都有一列。每次向系统中添加新的 quota 类型,都需要进行 schema 变更。采用 key-value 方式的 quota schema 可以添加新的 quota 类型,而无需后续的 schema 变更。
发布说明
增加了无限额度的 quota 概念。
前提条件
- 在本次 schema 变更降级时,可以删除 quota 表中的历史记录。有关更多详细信息,请参阅下面的迁移说明。
- 在本次变更之前的设计中,对于单个项目 ID 而言,拥有多个未删除的 quota 行是无效的,尽管 schema 支持多个这样的行。再次说明,有关详细信息,请参阅迁移细节。
设计
当前 quota 表的 schema 如下
Unique Int id Datetime created_at Datetime updated_at Datetime deleted_at Boolean deleted String project_id Int instances Int cores Int gigabytes Int floating_ips Int metadata_items
给定项目只有一个 quota 行。该行中的条目仅为覆盖--如果条目为 NULL,则表示使用标志中指定的默认值。
有一些建议要向 schema 中添加更多条目,特别是 RAM 限制。(链接?)如果我们将 schema 切换为如下所示,则此类更改不需要数据库迁移
Unique Int id Datetime created_at Datetime updated_at Datetime deleted_at Boolean deleted String project_id String resource Int limit
在此设计中,给定项目将拥有多行--每行对应一个非默认的 quota 设置。如果项目具有给定资源的默认限制,则不会为该资源创建一行。此外,该设计引入了无限额度的概念。当与给定资源关联的限制为 NULL 时,该资源对于该项目而言是无限的。
实现
代码变更
- nova/db/sqlalchemy/ 中的 schema 变更
- nova/db/api.py 中的数据库接口变更
- bin/nova-manage 的轻微变更
- 使 nova/quota.py 能够使用新的数据库接口
- 对测试的轻微变更
- 数据库迁移代码,见下文
数据库迁移
Upgrade preconditions::
本次变更之前的 schema 允许给定项目存在多个活动行。但是,一次只能应用一个 quota 行,并且存在一种竞争条件,即哪个 quota 集对于该项目将生效。数据库升级路径无法处理此问题,因为它不知道应该选择哪一行。因此,如果它识别出此条件,升级脚本将停止并且不会继续。部署者有责任在运行迁移之前清理这些行。看起来 nova-manage,这是将 quota 信息添加到项目的主要方式,不允许这种歧义,因此希望这个问题会比较少见。
Upgrade actions::
升级路径很简单。对于给定行中的每个非 NULL quota 列,我们都在新的 quotas 表中创建一个新行。如果 quota 值先前为 NULL,这意味着使用默认 quota,则不会向新表中添加任何行。时间戳和删除状态从旧行复制到创建的任何新行。
Downgrade preconditions::
本次变更后的 schema 存在与变更前 schema 类似的问题。我们希望使每个 (project_id, resource) 组合都是唯一的,但我们无法做到,因为 deleted 列会干扰。因此,降级脚本会检查以确保不存在任何具有相同 (project_id, resource) 对且 deleted 为 False 的重复项。如果找到任何此类重复项,脚本将中止。同样,部署者必须在重新尝试降级迁移之前解决此歧义。
Downgrade actions and consequences::
降级路径更加复杂。上述先决条件确保对于给定的 (project_id, resource, deleted=False),只有一行。这些行被组合成旧式 quotas 表中的一行。旧式行的 created_at 时间戳是项目集中最早的时间戳。旧式行的 updated_at 时间戳是项目集中最新的时间戳。任何资源名称未被识别为旧式 schema 的一部分的限制都不会被考虑。在降级迁移中,不清楚如何处理已删除的行。为了简单起见,这些行将被删除--也就是说,在降级时不会保留历史记录。如果部署者希望保留其记录的历史记录,则必须在降级之前拍摄数据库的快照。
测试/演示计划
这不必在规范接近 Beta 之前添加或完成。
未解决的问题
Deleted column::
数据库中每行的布尔 deleted 列允许部署者跟踪更改历史记录。但是,它也阻止了对其他列强制执行唯一性。也许最好将历史记录跟踪移动到另一个项目,或者至少移动到同一数据库中的另一个表。
Flag-based defaults::
默认设置是否应该移动到数据库中?
BoF 议程和讨论
使用本节记录 BoF 期间的笔记;如果将其保留在批准的规范中,请用于总结讨论内容并记录任何被拒绝的选项。