跳转到: 导航, 搜索

Nova/QuotaKeyValueSpec

  • Launchpad 条目:NovaSpec:nova-quota-schema
  • 创建时间:2011年5月8日
  • 贡献者:Mark Washenberger

总结

目前 nova 数据库中的 quota 表为我们管理的每种 quota 类型都有一列。每次向系统中添加新的 quota 类型,都需要进行 schema 变更。采用 key-value 方式的 quota schema 可以添加新的 quota 类型,而无需后续的 schema 变更。

发布说明

增加了无限额度的 quota 概念。

前提条件

  1. 在本次 schema 变更降级时,可以删除 quota 表中的历史记录。有关更多详细信息,请参阅下面的迁移说明。
  2. 在本次变更之前的设计中,对于单个项目 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 期间的笔记;如果将其保留在批准的规范中,请用于总结讨论内容并记录任何被拒绝的选项。