为 Nova Specs 添加 DB2 (v10.5+) 支持

https://blueprints.launchpad.net/nova/+spec/db2-database

社区目前支持 MySQL 和 PostgreSQL 生产数据库。其他几个集成项目已经支持 DB2。此蓝图为 Nova 添加对 DB2 作为生产数据库的支持。

问题描述

  • 目前社区中没有支持部署者使用 DB2 后端数据库运行 Nova 的方案。

  • 任何运行应用程序在现有的 DB2 数据库上,并希望迁移到 OpenStack 的用户,都必须使用不同的数据库引擎来运行 Nova 在 OpenStack 中。

  • 目前核心项目之间的支持矩阵不一致,因为大多数核心项目支持 DB2,但 Nova 尚不支持。

用例

作为部署者,我希望将 Nova 运行在 DB2 后端数据库上,以便为多个集成的 OpenStack 服务使用单个 DB2 数据库引擎。

项目优先级

没有,但是 OpenStack 中的大多数其他集成项目已经支持 DB2 后端数据库,或者正在努力实现该支持。

当前支持 DB2 的集成项目

  • Ceilometer

  • Cinder

  • Glance

  • Heat

  • Ironic

  • Keystone

  • Neutron

  • Trove

尚未支持 DB2 的集成项目

  • Sahara

此外,oslo.db 和 sqlalchemy-migrate 具有 DB2 支持。

提议的变更

添加代码以支持将 Nova 数据库迁移到 DB2 后端。这将需要全新部署 Nova,因为没有计划将现有的 Nova 数据库从其他引擎(例如 MySQL)迁移到 DB2。

单元测试代码也将更新以支持使用 ibm_db_sa 驱动程序针对 DB2 后端运行测试,并且所有 Nova 补丁都将针对使用 IBM 维护的 DB2 运行第三方 CI 的 Tempest 全量运行进行测试。

Oslo 的 db.api 层中已经存在一些代码来支持 DB2 的常见功能,例如重复条目错误处理和连接跟踪,因此这不属于此规范的一部分。

备选方案

部署者可以使用其他受支持的数据库后端,例如 MySQL 或 PostgreSQL,但这可能不是对于已经运行应用程序在 DB2 上,并希望与 OpenStack 集成的客户的理想选择。此外,您可以运行其他核心项目,并在单个 DB2 OpenStack 数据库中使用多个模式,但您必须单独运行 Nova,这会带来维护/配置问题。

数据模型影响

  1. 216 迁移将更新以处理 DB2 的条件,例如索引和外键创建。这里的主要问题是 DB2 不支持对可为空列上的唯一约束,而是会创建一个排除空键的唯一索引。Nova 创建的大多数唯一约束都在非空列上,但 instances.uuid 列是可为空的,并且 216 迁移在该列上创建了一个唯一索引,但这不允许创建引用 instances.uuid 列的外键,因为引用列必须是唯一约束或主键约束。

  2. 为了支持创建与实例.uuid 列引用相同的外部键,实例.uuid 列必须设置为非空,并且必须在该列上创建唯一约束。依赖蓝图“在数据模型中强制唯一实例 uuid”用于处理此更改(在 Kilo 中完成)。

  3. 最后,添加另一个迁移脚本,该脚本为 DB2 从 216 迁移脚本中排除的先前外键创建外键。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

现有部署中唯一的性能影响在于迁移脚本的更改,这些更改将使用 turbo-hipster 进行测试。

其他部署者影响

新的数据库迁移将创建缺失的外部键,因为在运行迁移时需要关闭控制节点。但是,新的迁移仅在后端是 DB2 时才创建外部键,正如提议的更改部分所述,这将是一个全新安装,因此影响应该很小。

开发人员影响

对开发人员的唯一影响是,如果他们正在添加与 DB2 不起作用的 DB API 代码或迁移,他们将必须相应地进行调整,就像我们今天使用 MySQL 和 PostgreSQL 一样。IBM 的积极技术贡献者将为需要 DB2 特定条件的类似问题提供支持/指导,尽管对于大多数情况,DB2 InfoCenter 提供了有关如何使用该引擎以及有关错误代码的足够详细信息。

实现

负责人

主要负责人

mriedem@us.ibm.com

工作项

  1. 更改 216 迁移以使其与 DB2 兼容。

  2. 添加一个新的迁移来为 DB2 从 216 脚本中排除的外键创建外键。

  3. 使 test_migrations.py 模块能够使用配置的 DB2 后端运行单元测试。

有关详细信息,请参阅 WIP 补丁:https://review.openstack.org/#/c/69047/

依赖项

  • 蓝图“在数据模型中强制唯一实例 uuid”(在 Kilo 中完成):https://blueprints.launchpad.net/nova/+spec/enforce-unique-instance-uuid-in-db

  • DB2 10.5 支持在 Icehouse 期间添加到 sqlalchemy-migrate 0.9:https://blueprints.launchpad.net/sqlalchemy-migrate/+spec/add-db2-support

  • 单元测试无需更改即可工作。运行时要求是 ibm-db-sa 和 ibm_db 模块,两者都可从 pypi 获取。sqlalchemy-migrate 可选地导入 ibm-db-sa。ibm-db-sa 模块需要一个本机编译的 ibm_db,该模块具有与 DB2 ODBC/CLI 驱动程序通信的 c 绑定。

  • 请注意,仅支持 DB2 10.5+,因为这是添加了对可为空列上的唯一索引支持的版本,而 sqlalchemy-migrate 采用这种方式处理可为空列上的唯一约束。

测试

有三种类型的测试要求,Tempest、单元测试和 turbo-hipster 性能/规模测试。每个测试都有不同的时间表来实施它们。

  • IBM 已经在现有的 Nova WIP 补丁上运行 DB2 的第三方 CI,该补丁添加了 DB2 支持。相同的第三方 CI 正在运行针对所有 sqlalchemy-migrate 更改的 DB2,在 py26/py27 上运行,并针对 Keystone/Glance/Cinder/Heat/Neutron/Ironic 补丁运行 Tempest,这些补丁使用 DB2 后端。一旦 DB2 支持合并,DB2 第三方 CI 将针对所有带有完整 Tempest 运行的 Nova 补丁运行。这被认为是此蓝图在 Liberty 版本中合并所需的测试。

  • 虽然将添加代码以使 Nova 单元测试能够针对 DB2 后端工作,但在 Liberty 版本中,在第三方 CI 中运行 Nova 单元测试针对 DB2 并不在此蓝图的范围内,但从长远来看,IBM 希望为 DB2 在 Nova 中的额外 QA 覆盖运行该测试。这将是在 Tempest 运行之后进行的工作。这里的大部分工作实际上是在 oslo.db 中完成的。交付第三方单元测试覆盖的计划是在 2016.1 ‘M’ 版本中。

  • 在 Liberty 版本中,不计划针对 DB2 运行第三方 turbo-hipster CI,就像不计划在第三方 CI 中运行针对 DB2 的单元测试一样,在第三方 CI 中运行针对 DB2 的 turbo-hipster 也是一个长期的 QA 目标,IBM 团队将在 Tempest 运行之后以及单元测试 CI 完成之后进行这项工作。交付第三方 turbo-hipster 性能测试覆盖的计划是在 2016.1 ‘M’ 版本中。

  • 未能按计划在 M 版本中交付第三方单元测试和/或 turbo-hipster 性能测试覆盖的惩罚是,Nova 团队将关闭 DB2 第三方 CI 的投票/报告,并且不允许 DB2 的 Nova 修复,直到第三方 CI 可用为止。

  • 邮件列表中的更多讨论:http://lists.openstack.org/pipermail/openstack-dev/2014-May/035009.html

文档影响

参考资料