数据库迁移重构

Launchpad蓝图

https://blueprints.launchpad.net/neutron/+spec/db-migration-refactor

Neutron数据库模式将被统一。它将独立于配置的核心插件和服务插件。

问题描述

数据库模式会根据配置的核心插件和服务插件的不同而不同。如果在部署启动后配置了新的或不同的插件,那么与新配置对应的早期迁移将会缺失。

这意味着迁移过程不是幂等的,导致模式版本依赖于当前配置。换句话说,当一个环境的模式处于特定版本时,它可能与另一个处于相同版本的环境不同。即使在同一个环境中的降级过程中也会发生这种情况。

提议的变更

使所有迁移都无条件执行。在迁移时间线上创建一个单点,在该点上创建所有表,并且无论使用哪些插件,数据库模式都是相同的。

此解决方案将引入一个“修复”迁移,该迁移将调用完成数据库模式所需的DDL,以便它包含所有数据库模型的所有表。此迁移将在icehouse_release版本和juno_release版本之间的时间线上发生。

重构将包括以下内容

  1. 调查模型和当前迁移,以确定实现完整数据库模式所需的条件。

  2. 一个修复迁移,确保数据库模式完整且一致。该版本将被命名为db_healing

  3. db_healing之后的 所有迁移都将是无条件的。这需要更新neutron-db-manage的–autogenerate行为,以及开发者文档。

修复迁移将像任何其他 alembic 迁移一样工作,即它将允许升级和降级。但是,它将在以下方面有所不同

  • 在升级方向上,修复迁移将内省模式,并且仅添加缺失的表。因此,它不能在离线模式下运行。(另请参见在线要求。)

    升级说明

    • 当修复迁移开始时,现有表的所有模式更改都已经到位(直接来自模型,或来自之前的迁移)。对于每个缺失的表,修复迁移将通过从模型创建模式来添加该表。

    • 修复迁移可能需要更改一些现有表以匹配其模型。在提议的实现经过更详细的测试之前,我们无法确定。如果需要这些更改,将逐个案例处理。有关更多详细信息,请参见实现部分。

  • 在降级方向上,修复迁移不会进行任何模式更改。这意味着它不会删除任何表。

    降级说明

    • 如果部署被升级并通过修复迁移降级,则模式将包含之前不存在的表。换句话说,如果部署降级回 Icehouse 或 Havana,Neutron 将表现和看起来与之前一样,但如果您查看 DB,它不是旧的 Icehouse 或 Havana DB,而是一个经过修复的 DB。

    • 如果在升级过程中更改了表以匹配其模型,则降级将在需要时反转更改。

迁移时间线

../../_images/db-migration-timeline.png

在线要求

我们无法支持修复迁移的离线模式的更多原因

  1. 我们不能使用“create table if not exists”,因为它仅受特定 sql 方言的支持。

  2. 表之间的依赖关系(例如外键)意味着我们需要检查所有依赖于当前表的表是否已经创建。

  3. Alembic 不支持条件 DDL。

备选方案

我们可以打破 Icehouse 之后的迁移时间线,并在 Juno 开始一个新的时间线,其中包含所有表,而不是修复迁移。可以提供一个手动脚本将模式从旧时间线转换为新时间线。这种替代方法具有以下缺点

  • 它不允许通过迁移进行降级。

  • 从旧时间线切换到新时间线对于部署者和 DB 管理员来说比一个时间线中的简单迁移更复杂的过程。

  • 在 Icehouse 版本弃用之前,我们需要支持 neutron 中的两个迁移时间线。

数据模型影响

一些数据库模型可能需要更新,以便基于核心和服务的插件拥有不冲突的模型。

REST API 影响

安全影响

通知影响

其他最终用户影响

最终用户不应受到任何影响。

性能影响

其他部署者影响

修复迁移是一个在线操作,必须由 DB 管理员运行。因此,部署者在升级或降级到 Juno 时必须与 DBA 协调。

修复迁移将在从 Icehouse 或更早版本迁移到 Juno 时运行。它的行为类似于正常的迁移,但它不支持离线模式升级。

修复迁移的降级什么也不做。因此,如果从db_healing降级到早期版本,则所有表都存在于模式中。

注意:Juno 版本或更高版本的全新部署将从新的迁移时间线开始,因此不会涉及任何修复。

开发人员影响

实现

大部分工作在于开发一个健壮的修复迁移。Alembic 将尽可能用于最大化自动化,但一些修复可能需要手动编码。

可能需要手动编码来解决的冲突示例

  • 如果两个不同的插件的两个不同的迁移添加了一个具有相同名称但不同类型的属性。

  • 如果在较早的迁移中修改了 ENUM,但其规范未针对 PostgreSQL 更新。

负责人

  • akamyshnikova

  • libosvar

  • rpodolyaka

工作项

依赖项

测试

应添加迁移的单元(和功能?)测试。我们计划利用已毕业的 oslo.db 包中的单元测试框架。

文档影响

  • 为此更改创建发行说明。

  • 更新操作员指南以进行升级。

  • 更新开发者文档以创建迁移脚本。

参考资料