介绍数据库迁移

https://storyboard.openstack.org/#!/story/2001654

大多数 OpenStack 服务使用 SQLAlchemy MigrateAlembic 来提供迁移脚本,这些脚本 (a) 更新服务的数据库模式(如果发生更改)和 (b) 根据需要迁移数据。目前,Monasca 不遵循此模式。相反,它为 PostgreSQL 或 MySQL 数据库提供简单的 SQL 脚本,这些脚本仅用于初始化数据库模式。对于后续更新代码所需的任何更改,操作员需要自行处理,即他们需要手动应用这些脚本以使 Monasca 正常工作。此规范建议引入 (a) 数据库迁移和 (b) 一个单独的工具,该工具分析现有数据库的模式状态,并添加必要的元数据以便将来通过迁移对其进行更新。

问题描述

简而言之,用于存储各种告警、通知和指标元数据的数据库模式是不可更新的。这是因为模式的真实来源是一个简单的 SQL 脚本,该脚本仅对空白数据库的模式初始化有用。

受此影响最大的是操作员,当代码更改需要数据库模式更改时,他们面临着几种不可取的选择

  1. 他们可以删除整个 Monasca 数据库并从头开始使用更新的 SQL 脚本重新创建它。这样他们将丢失所有告警定义以及通知设置、完整的告警历史记录以及一些指标元数据。

  2. 他们可以手动更新数据库并迁移数据(在列/表重命名的情况下)。这容易出错,并存在数据丢失的风险。

  3. 他们可以选择不采用该代码更改。如果更改在过时的数据库上中断,他们甚至可能需要创建和维护代码补丁。

除了操作员之外,缺乏数据库迁移基础设施对于 Monasca 开发人员来说也是一个重大障碍:它会将任何数据模型更改变成破坏性更改,因为需要更新模式。因此,当前的情况阻止了需要数据库更改的新功能,或者至少使它们极不受欢迎。

用例

  1. 操作员将能够更新 Monasca,而无需因数据库更改而面临破坏的风险。

  2. 开发人员可以修改数据模型,而不会破坏现有安装。

提议的变更

该提案旨在通过添加基于 Alembic 的命令行工具来改进当前状况,用于执行以下操作

  1. 一个遗留数据库迁移命令行工具。此命令行工具将检测数据库模式 SQL 脚本的哪个版本被使用,基于当前数据库中的表和列。然后,它将初始化数据库的迁移元数据,以便从那时起进行常规数据库迁移。

  2. 一个具有多个基本修订版的数据库迁移命令行工具,以涵盖以下场景

    1. 未初始化的数据库

    2. 由任何现有 SQL 脚本产生的模式状态

      修订版。

(1)和(2)可以作为同一工具的一部分来实现。

不支持基于第三方 SQL 脚本的数据库模式(这些脚本可能存在于用于部署 Monasca 的各种配置管理工具中)。

备选方案

这一变化是迟来的,并且是 OpenStack 中的最佳实践。也就是说,可以通过省略检测现有遗留数据库模式的启发式方法来大大减少其范围。这样,操作员将被迫删除数据库并使用迁移重新创建它。如果可能,我们不应该将此强加给操作员。

也可以使用纯 SQLAlchemy Migrate 而不是 Alembic 来实现迁移,但 OpenStack 似乎已经标准化为 Alembic(有关原因的讨论,请参见 https://wiki.openstack.org/wiki/OpenStack_and_SQLAlchemy)。

数据模型影响

这不会对数据模型本身产生影响。只会对如何将数据模型同步到数据库的运行时模式产生更改。

REST API 影响

不会对 REST API 产生影响。

安全影响

此更改的唯一略微相关的安全方面是为数据库迁移命令行工具提供数据库的访问凭据。对此的最佳实践是在 API 服务(在本例中为 monasca-api)也在运行的机器上以 root 身份运行它,并从 API 服务的配置中检索这些凭据。

其他最终用户影响

N/A

性能影响

N/A

其他部署者影响

使用遗留 SQL 脚本的配置管理必须更改为使用新的迁移工具。其中,Monasca devstack 插件必须修改为使用它们。更新到具有此功能的 Monasca 版本的用户可能需要运行一个特殊的迁移,以便将版本控制元数据添加到其数据库模式中。

开发者影响

在实施此功能后,进行数据模型更改的任何开发人员都必须编写一个迁移脚本来相应地更新数据库模式。

实现

负责人

主要负责人

<jgr-launchpad>

任务

  • 添加用于常规迁移(即,版本控制数据库的迁移)和将非版本控制数据库转换为版本控制数据库的命令行工具。

  • 从以下位置创建迁移链

    • 空数据库

    • 存储库中模式文件的所有修订版。

依赖项

N/A

测试

只有在具有实际数据库进行测试的完整 Monasca 部署中才能进行有意义的测试。特别是,测试的重点应放在使用 devstack/files/schema/mon_mysql.sql 中的遗留 SQL 脚本的所有修订版进行测试。此测试可以在 Devstack 设置的早期阶段进行,如下所示

  1. 从 git 存储库检出每个 SQL 脚本修订版,将其应用于数据库,并通过运行数据库上的转换操作将其转换为“可迁移”数据库。每次迭代后,都会删除数据库以准备下一次修订版。

  2. 最后,执行空白数据库的初始迁移,然后 Devstack 正常进行。

由于 PostgreSQL 在 OpenStack 中已弃用,因此使用 MySQL 风格的 SQL 脚本实现测试就足够了。

文档影响

需要在操作员/部署者文档中记录此功能,以确保操作员使用迁移而不是遗留 SQL 脚本。

参考资料