支持 PostgreSQL 作为 Tacker DB 后端¶
https://blueprints.launchpad.net/tacker/+spec/support-multidb-backend
本规范提出改进 tacker-db-manage,以支持多 DB 后端,特别是 PostgreSQL 作为 Tacker DB 后端。
问题描述¶
OpenStack Tacker 已经支持 MySQL 作为数据库后端。在初始化 DB 时,tacker-db-manage 会升级数据库并运行与 DB 后端类型对应的任何数据库迁移。
$ /usr/local/bin/tacker-db-manage --config-file \
/etc/tacker/tacker.conf upgrade head
DevStack [1] 包含一组脚本和实用程序,用于开发 OpenStack 环境,也支持 MySQL 和 PostgreSQL。但是,当前的 Tacker 和 tacker-db-manage 不支持 PostgreSQL,并且由于 MySQL 和 PostgreSQL 之间的实现差异,导致了一些实际错误。
提议的变更¶
本规范提出以下更改。
通过 tacker-db-manage 支持 PostgreSQL
通过 Tacker 支持 PostgreSQL
在 Tacker 安装指南中添加配置以将 PostgreSQL 设置为 Tacker DB 后端以及 PostgreSQL 安装手册
通过 tacker-db-manage 支持 PostgreSQL¶
添加 PostgreSQL 的初始化函数,并适应 MySQL 和 PostgreSQL 之间实现差异。这些函数将通过更改参数或在 tacker-db-manage 中使用分支过程来实现。
以下项目将针对 PostgreSQL 进行修复和添加。
问题 |
PostgreSQL 的实现 |
|---|---|
布尔类型错误(MySQL 使用 |
替换 smallint(1)。 |
文本类型错误(PostgreSQL 不在 TEXT(length) 中设置上限值。) |
替换 VARCHAR(length)。 |
MEDIUMTEXT 无法在 PostgreSQL 中使用。 |
替换 TEXT。 |
PostgreSQL ENUM 类型需要一个名称。 |
添加一个名称属性(例如 name=`verbosity`)。 |
Json 常用函数(例如,json_extract()、json_length())无法在 PostgreSQL 中使用。 |
替换 decode()、json_array_length() 和 json 搜索方法。 |
SQL 单词,例如 CHANGE 和 GENERATED 无法在 PostgreSQL 中使用。 |
替换其他 SQL 命令。 |
ifnull() 无法在 PostgreSQL 中使用。 |
替换 coalesce()。 |
索引 |
替换 op.drop_constraint()。 |
注意
Tacker 通过 tacker-db-manage [2] 提供从 v1 API 到 v2 API 的 VNF 版本升级工具。但是,本规范提供的 PostgreSQL 环境不支持 VNF 版本升级功能。
通过 Tacker 支持 PostgreSQL¶
为了支持 PostgreSQL,Tacker 也需要进行修复。这些函数将通过更改参数或在 Tacker 中使用分支过程来实现。以下项目将进行修复和添加。
问题 |
PostgreSQL 的实现 |
|---|---|
jsonutils.dump_as_bytes() 将 json 转换为二进制数据。 |
使用 jsonutils.dumps(value)。 |
<class dict> 初始化不同(NULL 和空)。 |
支持空字典。 |
在 |
修复比较目标的类型。 |
添加配置以将 PostgreSQL 设置为 Tacker DB 后端¶
当 Tacker 使用 PostgreSQL 作为 DB 后端时,PostgreSQL (postgresql.conf) 和 Tacker (tacker.conf) 的配置也需要更改。
postgresql.conf
$ vi /etc/postgresql/12/main/postgresql.conf
bytea_output = 'escape'
tacker.conf
$ vi /etc/tacker/tacker.conf
[database]
connection = postgresql://tacker:<POSTGRES_PASSWORD>@<POSTGRES_IP>/tacker?client_encoding=utf8
注意
由于用户需要在使用 PostgreSQL 时自行设置上述配置,因此将在安装指南中描述 PostgreSQL 的示例配置。
将 PostgreSQL 初始化为 Tacker DB 后端的流程¶
以下序列图描述了将 PostgreSQL 初始化为 Tacker DB 后端的流程。
客户端在 PostgreSQL 中创建 Tacker DB 和用户。
客户端请求 Tacker 为 PostgreSQL 执行 tacker-db-manage。
Tacker 执行 tacker-db-manage。
Tacker-db-manage 在 PostgreSQL 中更新 Tacker DB。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
部署者需要从 tacker.conf 设置 PostgreSQL 的使用情况。
开发人员影响¶
将来向 Tacker DB 添加新表时,开发人员应支持多 DB,例如 MySQL 和 PostgreSQL。
实现¶
负责人¶
- 主要负责人
Yuta Kazato <yuta.kazato.nw@hco.ntt.co.jp>
- 其他贡献者
Shun Higuchi <higuchis@intellilink.co.jp>
Reina Yoshitani <yoshitanir@intellilink.co.jp>
Tetsuro Kaneko <kaneko_te@tdc.co.jp>
工作项¶
将 PostgreSQL 迁移函数添加到 tacker-db-manage。
将 PostgreSQL 迁移函数添加到 Tacker。
将 PostgreSQL 安装手册添加到 Tacker 安装指南。
依赖项¶
无
测试¶
tacker-db-manage 和 Tacker 将使用单元测试用例。
文档影响¶
将在 Tacker 安装指南中添加 PostgreSQL 配置。