CellsV2 - 将配额表迁移到 API 数据库

https://blueprints.launchpad.net/nova/+spec/cells-quota-api-db

作为 CellsV2 工作的一部分,我们正在拆分当前的 cell 数据库。Nova 中的配额是全局的,应该跨 cell 应用。因此,它们的数据需要驻留在 API 数据库中。

问题描述

项目和用户的配额需要在 cell 边界上强制执行。配额也在 API 中公开。如果配额仍然保留在 cell 数据库中,则需要修改 API 以公开 cell 信息。或者,配额数据必须复制到所有 cell 中,这将使得强制执行全局配额变得困难。

用例

操作员和用户希望强制执行在 cell 之间适用的配额。

提议的变更

我们建议将当前驻留在 cell 数据库中的与配额相关的表迁移到 API 数据库。这些表是

quotas
quota_classes
quota_usages
project_user_quotas
reservations

将在 API 数据库中创建数据库模型。这些将与 cell 数据库中现有的模型密切匹配。可以对这些表进行一些修改,以清理现有的数据模型。

nova 中的 Quota 对象使用 quota.py 中的函数。它主要是一个 RPC facade,用于 quota.py API。 quota.py 中的 DbQuotaDriver 将被修改为访问 API 数据库。

将为现有的数据库访问创建包装方法。对 quotasquota_classesproject_user_quotas 表执行任何 get 类型操作的包装方法将被修改为首先从 API 数据库加载。如果未找到该项目,则将在 cell 数据库中搜索它。

由于经常会尝试访问 project_user_quotasquotas 中的空条目,我们需要缓存一个指示迁移完成的值。如果没有此值,将尝试两次读取这些表中的空条目。相反,流程将是

use_api_database_only = False
value = get_from_api_database()

if use_database_only == False:
    if not value and is_cell_database_empty():
        use_api_database_only = True
else:
    value = get_from_cell_database()

将创建迁移函数,以将数据从 cell 迁移到 API 数据库。这些方法将添加到 nova manage online_data_migrations 命令中。

flavors 的迁移已经完成,对于上述表,我们将通常遵循此示例。[3]

quota_usagesreservations 表将不会从两个数据库中读取。不会对 usages 和 reservations 进行数据迁移。将创建访问这些表在 API 数据库中的新数据库访问方法。 DbQuotaDriver 代码将被修改为使用这些方法。当在 API 数据库中找不到 usages 或 reservations 时,将对配额进行 sync 调用,以将当前 usage 写入 API 数据库。

备选方案

在不改变配额性质的情况下,DbQuotaDriver 很有可能需要将其表迁移到 API 数据库。配额的一般替代方案包括 ‘Quotas Reimagined’ [1] 和 ‘Delimiter’ [2] 项目。前者规范可能仍然会使用一些需要迁移的现有表。单独的配额库或服务将创建一个全新的配额数据存储。

数据模型影响

数据模型的影响将很大,因为将在 API 数据库中创建许多新表。由于模型与 cell 数据库基本相同,因此此处不会详细介绍模型。

REST API 影响

无 - Cells 实现不应在 API 中公开。

安全影响

无,将配额数据迁移到 API 数据库可以尽可能地保持实现与当前模型一致。打破配额执行应该不会比现在更困难或更容易。

通知影响

其他最终用户影响

性能影响

更改的性能影响可以忽略不计。但是,对于 CellsV2 针对的大规模部署,DbQuotaDriver 的性能也不会得到改善。

在迁移期间,配额操作和因此构建请求将产生更大的性能影响。这是因为对 quotaproject_user_quotaquota_classes 表的数据库访问可能需要两个数据库请求。此外,升级后 quota_usagesreservations 表将不会被迁移。这将需要一个 sync 调用,直到这些表被填充。

这种性能影响是短期的,并将持续到数据迁移完成。

其他部署者影响

部署者必须了解升级时的数据迁移。他们必须了解 nova-manage 命令才能将数据迁移到 API 数据库。

开发人员影响

实现

负责人

主要负责人

<mjdoffma@us.ibm.com>

其他贡献者

工作项

  • 创建 API 数据库中的配额表数据库模型和迁移。

  • 创建配额 usages 和 reservations 的数据库模型和迁移。

  • 创建 API 数据库的数据库访问和包装方法。

  • 修改 DbQuotaDriver 以使用新的数据库访问方法。

  • 确保 DbQuotaDriver 在 API 数据库中找不到 usages 时重新同步配额。

  • 创建迁移方法以将数据迁移到 API 数据库,并将此方法添加到 online_data_migrations 中。

依赖项

测试

  • 添加新的数据库模型的单元和功能测试。

  • 添加新的数据库访问包装方法的单元测试。

  • 添加新的数据迁移功能测试。

  • 修改配额驱动程序的单元测试。

  • 增强现有的配额功能测试。

文档影响

操作员文档可能需要修改,以包含有关使用 nova-manage 命令升级和迁移数据的详细信息。

参考资料

历史

修订

发布名称

描述

Newton

已引入但未合并任何更改。

Ocata

重新提出。