Docker 实战案例解析,实现自动化数据库迁移

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 在 Phorest Salon Software 公司,我们是在 AWS 上运行我们的平台。该平台由 VPC 内的许多 AWS 资源(实例,数据库)组成。我们的大部分服务都运行在由亚马逊 ECS 管理的 Docker 容器上。

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!


在 Phorest Salon Software 公司,我们是在 AWS 上运行我们的平台。该平台由 VPC 内的许多 AWS 资源(实例,数据库)组成。我们的大部分服务都运行在由亚马逊 ECS 管理的 Docker 容器上。


迁移的挑战

我们有三个专用环境:开发、分段构建和生产。每个环境都有自己的专用 VPC,因此 VPC 中的资源不能直接从外部访问,通常来说这是很好的。

问题是我们有时需要修改某些组件的模式结构,例如:添加一个新的表或列。在 Java-ish 中,我们使用 Liquibase 来管理 DDL / DML 的更改。同样的,通常来说这是很好的。但是我们要如何才能使这些更改通过持续交付的方式应用到各个不同的环境中呢?

我们针对上述问题,提出了几种解决方法:

1、在启动时执行

您可以让您的组件执行此操作。例如,您可以将应用程序配置为在启动时应用它。对于 Spring Boot 应用程序来说,这非常简单。您只需将 liquibase jar 添加到环境变量并配置一些配置属性即可实现此目的。

这种方法对于在本地的开发或开发环境来说可能是很好的,但是对于分段构建或生产呢?问题在于,您的数据库迁移脚本可能很慢,执行它们可能需要几分钟、几个小时甚至几天的时间。

对于上述情况,使用 ECS 的效果就不太理想了,因为在那里部署服务时,您定义了 ECS 将用于验证组件的运行状态,在执行数据库迁移脚本的情况下启动它,会导致整个迁移过程被认为是不健康的。而且 ECS 可能会在迁移过程中杀死您的容器。您可以为 ECS 服务配置一个宽限期,但这可能很难预测到它的值,因为每个迁移都可能不同。

2、手动应用

另一种选择是 SSH 连接到与服务在同一个 VPC 中运行的EC2实例,并从那里手动运行迁移脚本(你可能知道这种做法有多糟糕)。

3、使用 docker 容器

另一个选择是创建一个专用的 docker 镜像来运行迁移脚本。我们选择了这个选项:

定义 docker 镜像:

screenshot

我们使用了一个开源的基础镜像,它为我们提供了一种执行 Liquibase 更改日志的方法。我们所要做的就是定义一些环境变量并将 Liquibase 更改日志复制过去。空变量是故意放进去的,以便大家在运行容器时记得替换掉它们。


我们将镜像定义文件与我们的代码库一起存储,因此在发布时会对其进行版本控制和标记。有了这一点,我们更新了 Jenkins 的工作,作为工作流程的一部分来构建和推动新的 docker 镜像。

下一步是更新 Jenkins 的工作来触发使用我们的新镜像迁移数据库的 ECS 任务。为此,我们使用了自己的框架,但您可以使用 Terraform 或K8s,或者您甚至可以使用以下命令手动运行它(请不要在生产中执行!)

docker run your-image-tag liquibase update

screenshot


使用新步骤构建管道


这种方法的好处

由于我们不在容器启动时运行迁移,所以我们不再有与长时间运行的迁移相关的问题,从而导致 ECS 运行状况检查失败。但好处是,我们的迁移现在已经与我们的部署分离了(这是一篇很好的文章,解释了从应用程序部署中分离数据库迁移的好处)。

使用这种新方法,我们必须确保我们的迁移始终与当前在生产中运行的代码兼容。它需要一些额外的工作,但现在意味着我们可以毫不费力地回滚我们的版本。

解决这个问题可能还有许多其他(也许更好)的方法,但是这种方法对我们更有效。如果你对这个话题有任何想法或想法可以在文尾处留言与我们探讨。

相关文章
|
21天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
62 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
20天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
39 2
|
25天前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
25天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
50 3
|
27天前
|
算法 大数据 数据库
云计算与大数据平台的数据库迁移与同步
本文详细介绍了云计算与大数据平台的数据库迁移与同步的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例及未来发展趋势与挑战。涵盖全量与增量迁移、一致性与异步复制等内容,旨在帮助读者全面了解并应对相关技术挑战。
35 3
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
46 15
|
28天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
77 2
|
28天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
1月前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
55 1
|
1月前
|
缓存 网络协议 网络安全
docker中DNS解析问题
【10月更文挑战第6天】
166 6
下一篇
无影云桌面