原文链接 作者|Shant Stepanian ,高盛平台业务部的高级工程师
本文重点
- Obevo 是在高盛开发的企业级数据库部署工具,在 2017 年以 Apache 2.0 许可证发布的开源项目。
- 允许将数据库脚本按对象进行组织,类似于应用代码,对开发人员来说好处多多。
- 可以帮助具有现有数据库的新应用和系统将其数据库更改管理纳入软件开发生命周期 (Software Development Life Cycle / SDLC) 管控。
- 团队可以使用 Obevo 的上手工具和引导示例快速入门。
- 其他功能包括回滚,内存数据库测试和分阶段部署。
近年,高盛采用了标准的 SDLC 来构建和部署应用程序。这包括管理新系统和现有系统的数据库 schema ,这比管理应用程序代码更加困难。在本文中,我们将描述我们最近开源的数据库部署工具 Obevo 是如何帮助高盛的企业级应用程序的数据库纳入 SDLC 管控的。
企业的数据库部署的问题
将数据库定义引入到标准的 SDLC 流程中是具有挑战性的,尤其是考虑到数据库的状态以及执行增量迁移的需求。因此,许多应用程序没有自动化或流畅的数据库部署过程。我们的目标是将数据库 schema 管理纳入与应用程序相同的 SDLC 中:通过将所有定义提交到版本控制系统 (VCS) 并通过标准的构建/发布机制部署。
这项工作由我们实际数据库系统使用案例的多样性而变得复杂:
- 现代系统:全新的 schema 来部署表、进行内存测试,并从一开始就纳入了适当的 SDLC。
- 遗留系统:超过十年的系统,从未有过受控部署过程。
- 复杂系统:数百或数千个对象,包括表、视图、存储过程、函数、静态数据上传和数据迁移等类型。
- 耗时系统:包含数百万行的表,需要花几个小时部署。
无论使用何种案例,由于大量分布各地的开发人员都在进行变更,SDLC 本身都有复杂之处。
虽然现有的开源工具可以处理简单的案例,它们无法处理我们一些现有系统的规模和复杂度。但是我们不能放任这些现有系统没有适当的 SDLC:它们是正在开发和发布的关键系统。
因此,我们开发了 Obevo,一个能处理所有此类使用案例的工具。Obevo 的关键差异化因素在于能够按文件维护数据库对象(类似于更常见的按文件存储类定义),同时仍管理增量部署。
在本文中,我们将讨论数据库部署问题,然后演示基于对象的项目结构如何帮助我们优雅地管理各种对象和环境类型的上百上千个 schema 对象。
数据库对象类型(有状态 vs 无状态)
首先,我们来回顾一下不同数据库对象类型的部署语义,因为这会影响工具的设计。
快速术语说明:
- 将某些代码 / SQL 应用于修改数据库的行为将被称为部署或迁移。
- 被部署的代码单元将被称为脚本片段。
- 一个文件可能包含多个脚本片段,即脚本片段不等同于脚本文件。关于一个文件是否应该包含一个还是多个脚本片段是本文中的主题。
有状态对象(例如:表)
有状态对象需要增量修改其定义,而不是完全的定义替换。以下是添加两列到 MyTable 中的示例:
理想情况下,我们可以通过一个 SQL 语句来把数据库带到终态,该 SQL 定义了一个具有四列的表。不过 SQL 其实无法提供可行的解决方案:
- 删除并重新创建表意味着你会失去数据
- 将数据保存在临时表中可能是一个昂贵且复杂的操作
相反,关系型数据库管理系统 (RDBMS) 允许用户使用 ALTER 语句来修改现有表。
某些列更新可能需要进行数据迁移,例如从一