DB 支持

https://blueprints.launchpad.net/vitrage/+spec/db-support

Vitrage 需要持久化 DB。主要原因是历史记录和高可用性,但持久化 DB 还有其他用途,例如保存已注册的 REST 通知接收者,以及使用 DB 功能提高性能。我们将使用 sqlalchemy 进行 DB 管理,与 Nova、Heat、Aodh 和其他项目相同。

问题描述

Vitrage 应该支持持久化 DB 管理。

提议的变更

开发将分几个阶段进行。为了加快 Vitrage 历史记录/HA/Vitrage 通知功能的开发,第一阶段将只开发基本的 sqlalchemy 支持。

注意:sqlalchemy 实现的一个很好的例子可以在以下链接找到:

https://github.com/openstack/aodh/blob/master/aodh/storage/impl_sqlalchemy.py


vitrage.conf 中的基本配置

# 用于连接数据库的 SQLAlchemy 连接字符串。

# 示例

# connection = mysql://root:pass@127.0.0.1:8999/vitrage

#connection = <None>


# 用于 MySQL 会话的 SQL 模式。此选项(包括默认值)会覆盖任何服务器设置的 SQL 模式。要使用服务器配置设置的任何 SQL 模式,请将其设置为空值。示例:mysql_sql_mode=

# (字符串值)

# (string value)

# (string value)

# 附加模式及其功能

# https://dev.mysqlserver.cn/doc/refman/5.7/en/sql-mode.html#sql-mode-combo

#mysql_sql_mode = TRADITIONAL


# 闲置 SQL 连接被回收前的超时时间。(整数值)

#idle_timeout = 3600


# 池中保持打开的 SQL 连接的最小数量。(整数值)

#min_pool_size = 1


# 池中保持打开的 SQL 连接的最大数量。将值设置为 0 表示没有限制。(整数值)

# 0 表示无限制。(整数值)

#max_pool_size = 5


# 启动期间数据库连接重试的最大次数。设置为 -1 表示无限重试。(整数值)

# 指定无限重试计数。(整数值)

#max_retries = 10


# 打开 SQL 连接重试之间的间隔。(整数值)

#retry_interval = 10


# 如果设置,将此值用于 SQLAlchemy 的 max_overflow。(整数值)

#max_overflow = 50


# SQL 调试信息的详细程度:0=无,100=所有。(整数

# 值)

# 最小值:0

# 最大值:100

#connection_debug = 0


# 将 Python 堆栈跟踪作为注释字符串添加到 SQL 中。(布尔值)

#connection_trace = false


# 如果设置,将此值用于 SQLAlchemy 的 pool_timeout。(整数值)

#pool_timeout = <None>


# 启用连接丢失时实验性地使用数据库重新连接。

# (布尔值)

#use_db_reconnect = false


# 数据库事务重试之间的秒数。(整数值)

#db_retry_interval = 1


# 如果为 True,则增加数据库操作重试之间的间隔,直到

# db_max_retry_interval。(布尔值)

#db_inc_retry_interval = true


# 如果设置了 db_inc_retry_interval,则数据库操作重试之间的最大秒数。(整数值)

# 数据库操作。(整数值)

#db_max_retry_interval = 10


# 在引发错误之前,连接错误或死锁错误情况下的最大重试次数。设置为 -1 表示无限重试。(整数值)

# 在引发错误之前。

#db_max_retries = 20

步骤 1

构建一个基本的 sqlalchemy 实现,用于连接到 DB,在 DB 中创建 Vitrage 模式和所需的表(来自 Vitrage 历史记录规范和 Vitrage httppost 注册规范)。每个开发人员都应该将自己的表添加到模式并进行测试。

模式和表应每次 Vitrage 加载时从 Vitrage 动态创建。Vitrage 将测试数据库表是否存在,如果不存在,则使用“模型”数据表示创建它们。在第一阶段不需要测试现有表的有效性甚至修复它们。

Cinder 数据模型示例:https://github.com/openstack/cinder/blob/master/cinder/db/sqlalchemy/models.py

创建将在表上执行硬编码 CRUD 的 DAO。

步骤 2

  • 使用 alembic 进行升级/版本控制。

  • 通用 sql 支持。

  • 大型查询(例如所有实体图或事件表)的分页。

备选方案

今天不行。

数据模型影响

这个整体设计对数据模型影响巨大。

REST API 影响

安全影响

流水线影响

其他最终用户影响

性能/可扩展性影响

应应用适当的索引,并根据开发过程中的性能测试,将多表数据拆分为较小的索引表,以提高数据轮询性能。

其他部署者影响

开发者影响

实现

负责人

主要负责人:danoffek. alexey_weyl。

工作项

  • 创建一个基本的 SQLAlchemy 实现来连接到 DB。

  • 为事件和其他表创建数据模型。

  • 为事件存储创建简单的 CRUD 方法。

  • CRUD 模板

  • 按“测试”中说明进行测试。

未来生命周期

参见“步骤 2”

依赖项

测试

单元测试

  • 数据选择查询

  • 数据更新

  • 创建带索引的表

  • (不应在网关或定期运行)在大型表数据上进行性能测试,每秒多次插入,持续一小时。


Tempest 测试:每个开发人员都应该创建自己的 DB tempest 测试。例如:创建告警/资源事件,然后轮询系统。如果数据未正确存储在事件表中,则应发出错误。

文档影响

DB 配置应记录在一个 .rst 文件中,并且应从 https://github.com/openstack/vitrage/blob/master/doc/source/installation-and-configuration.rst 链接到该文件

参考资料