支持 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 使用 tinyint(1) 作为布尔值。)

替换 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()。

索引 auth_url 在 PostgreSQL 中不存在。

替换 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 和空)。

支持空字典。

deleted 列中存在类型比较错误。

修复比较目标的类型。

添加配置以将 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 后端的流程。

../../_images/014.png
  1. 客户端在 PostgreSQL 中创建 Tacker DB 和用户。

  2. 客户端请求 Tacker 为 PostgreSQL 执行 tacker-db-manage。

  3. Tacker 执行 tacker-db-manage。

  4. 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 配置。

参考资料