云原生声明式数据库结构迁移工具 - SchemaHero

SchemaHero 是一个开源的声明式数据库 schema 迁移的云原生工具,可将 schema 定义转换为可在任何环境中应用的迁移脚本 。作为 CLI 工具和 Kube.NETes Operator 编写的 SchemaHero 消除了创建和管理与运行应用程序的所有环境兼容的顺序迁移脚本的任务 。

云原生声明式数据库结构迁移工具 - SchemaHero

文章插图
【云原生声明式数据库结构迁移工具 - SchemaHero】 
许多数据库 schema 管理工具创建了一个命令式接口,要求开发人员了解 schema 的当前状态以及将当前 schema(和相关数据)迁移到新的 schema 的相关命令, SchemaHero 提出了一个声明式接口的方式来替换穿透的命令式接口 。
声明式模型以声明式方式管理数据库 schema 有很多好处,包括:
  1. 遵守变更管理流程的能力
  2. 可重复部署到新环境
  3. 兼容新运行时
在声明式模型中,仅定义 schema 的当前状态,声明式 schema 管理程序会负责将 schema 从之前的任何状态迁移到所需状态所需的命令,只存储当前状态的好处是,在创建新的环境或者实例时,将不需要以前使用的数据库扩展、表等数据 。
传统的数据库引擎通过被称为 DDL (数据定义语言)的 SQL 语句子集来接收 schema 变更 。开发人员不需要为他们所针对的每个数据库引擎了解 DDL 之间的差别,根据数据库的能力和状态,从一个统一的声明式模型转换为适当的 DDL 命令可以通过编程方式进行处理 。
当采用声明式模式来定义数据库 schema 管理时,就可以在应用之前根据一组策略来对 schema 进行验证 。这对于只存储迁移脚本的命令式工具来说是不容易实现的 。有了所需要的全部可用状态,就可以根据一组规则评估数据库 schema,以确保策略和最佳实践得以执行 。
数据迁移有两种类型的迁移需要管理和部署 。
  1. Schema 迁移
  2. 数据迁移
Schema 迁移可以使用用 SQL 语法来表示,并改变数据库的结构 。这些往往是一些新的表、列变更、更改索引数据等等 。这些都是常用的写法,并且总是可以用幂等的语法来表达 。不同的数据库引擎对如何应用这些规则执行不同的规则 。例如,MySQL 不允许在事务中执行 schema 迁移,而 Postgres 是可以的 。Schema 管理往往是数据库所独有的方式,而 SchemaHero 则专注于处理 schema 迁移 。
不太常见的是,开发人员必须将一些数据迁移到数据库中的新格式 。这可能涉及到计算一个新列并将其写入,或者在代码中创建新的值并将其插入它们 。许多传统的数据库管理工具将 shema 迁移和数据迁移的任务融合到一个工具中去了 。
SchemaHero 目前专注于 schema 迁移,并计划在未来支持数据迁移 。
使用接下来我们将来部署 SchemaHero 和一个示例数据库,将为一个虚拟的航空公司预订系统设计一个非常基本的数据库,并将其部署到 PostgreSQL 上去 。
一开始我们将部署一个空数据库,创建一个初始 schema,然后修改该 schema,使其最终得到以下表结构:
云原生声明式数据库结构迁移工具 - SchemaHero

文章插图
 
安装 SchemaHero安装 kubectl 插件SchemaHero 客户端组件被打包成了一个 kubectl 插件,并通过 krew 包管理器发布,所以首先我们需要先安装 krew,安装了 krew 过后,使用下面的命令即可安装 SchemaHero 客户端 。
$ kubectl krew install schemahero安装后可以通过下面的命令来校验是否安装成功 。
$ kubectl schemahero version正常你会看到安装的 SchemaHero 版本( 0.12.1 或类似版本) 。
安装集群内组件一旦安装了 kubectl 插件,我们就可以安装 SchemaHero 在 Kubernetes 集群中的组件了,只需要使用下面的命令即可一键安装:
$ kubectl schemahero install该命令将创建一个名为 schemahero-system 的命名空间,并部署一个 SchemaHero operator ,可以通过执行以下命令来确认是否已经安装 SchemaHero :
$ kubectl get pods -n schemahero-system正常情况下应该会看到 1 个 pod 正在运行,输出将类似于以下内容:
NAMEREADYSTATUSRESTARTSAGE schemahero-01/1Running038s客户端和集群组件都安装好过后,接下来我们可以去连接数据库 。
连接数据库接下来我们需要部署一个 PostgreSQL 实例,然后配置 SchemaHero 来管理该数据库实例 。


推荐阅读