为 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,这会带来维护/配置问题。
数据模型影响¶
216 迁移将更新以处理 DB2 的条件,例如索引和外键创建。这里的主要问题是 DB2 不支持对可为空列上的唯一约束,而是会创建一个排除空键的唯一索引。Nova 创建的大多数唯一约束都在非空列上,但 instances.uuid 列是可为空的,并且 216 迁移在该列上创建了一个唯一索引,但这不允许创建引用 instances.uuid 列的外键,因为引用列必须是唯一约束或主键约束。
为了支持创建与实例.uuid 列引用相同的外部键,实例.uuid 列必须设置为非空,并且必须在该列上创建唯一约束。依赖蓝图“在数据模型中强制唯一实例 uuid”用于处理此更改(在 Kilo 中完成)。
最后,添加另一个迁移脚本,该脚本为 DB2 从 216 迁移脚本中排除的先前外键创建外键。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
现有部署中唯一的性能影响在于迁移脚本的更改,这些更改将使用 turbo-hipster 进行测试。
其他部署者影响¶
新的数据库迁移将创建缺失的外部键,因为在运行迁移时需要关闭控制节点。但是,新的迁移仅在后端是 DB2 时才创建外部键,正如提议的更改部分所述,这将是一个全新安装,因此影响应该很小。
开发人员影响¶
对开发人员的唯一影响是,如果他们正在添加与 DB2 不起作用的 DB API 代码或迁移,他们将必须相应地进行调整,就像我们今天使用 MySQL 和 PostgreSQL 一样。IBM 的积极技术贡献者将为需要 DB2 特定条件的类似问题提供支持/指导,尽管对于大多数情况,DB2 InfoCenter 提供了有关如何使用该引擎以及有关错误代码的足够详细信息。
可以在这里找到 DB2 SQL 错误消息说明:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp?topic=%2Fcom.ibm.db2.luw.messages.sql.doc%2Fdoc%2Frsqlmsg.html
可以在这里找到有关使用 python 开发 DB2 的信息:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp?topic=%2Fcom.ibm.swg.im.dbclient.python.doc%2Fdoc%2Fc0054366.html
OpenStack 中 DB2 问题的联系人
Matt Riedemann (mriedem@us.ibm.com) - Nova 核心成员
Brant Knudson (bknudson@us.ibm.com) - Keystone 核心成员
Jay Bryant (jsbryant@us.ibm.com) - Cinder 核心成员
Rahul Priyadarshi (rahul.priyadarshi@in.ibm.com) - ibm_db_sa 维护者
DB2 CI wiki 页面还提供有关第三方测试失败问题的联系信息:https://wiki.openstack.org/w/index.php?title=IBM/IBM_DB2_CI
实现¶
负责人¶
- 主要负责人
工作项¶
更改 216 迁移以使其与 DB2 兼容。
添加一个新的迁移来为 DB2 从 216 脚本中排除的外键创建外键。
使 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
文档影响¶
社区中的安装指南没有详细说明数据库的设置。RHEL/Fedora 安装指南说明使用 RDO 中 openstack-utils 提供的 openstack-db 脚本,该脚本使用 MySQL。其他安装指南只是说明 SQLite3、MySQL 和 PostgreSQL 是广泛使用的数据库。因此,对于安装指南,将更新关于支持的数据库的通用语句,以将 DB2 添加到列表中。以下位置也将进行更新
安全指南的第 32-34 章中有数据库主题,因此 DB2 也需要考虑,特别是
参考资料¶
正在进行中的 nova 补丁:https://review.openstack.org/#/c/69047/
“在数据模型中强制唯一实例 uuid”规范:https://specs.openstack.org/openstack/nova-specs/specs/kilo/approved/enforce-unique-instance-uuid-in-db.html
Stackforge 上有 Chef cookbook 支持配置 OpenStack 以使用现有的 DB2 安装:http://git.openstack.org/cgit/stackforge/cookbook-openstack-common/
邮件列表线程关于第三方测试:http://lists.openstack.org/pipermail/openstack-dev/2014-May/035009.html
DB2 10.5 InfoCenter:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp
一些较旧的手动设置 DB2 与 OpenStack 的说明:http://www.ibm.com/developerworks/cloud/library/cl-openstackdb2/index.html
ibm-db-sa:https://code.google.com/p/ibm-db/source/clones?repo=ibm-db-sa
DB2 第三方 CI Wiki:https://wiki.openstack.org/w/index.php?title=IBM/IBM_DB2_CI