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

简介: 在 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 运行状况检查失败。但好处是,我们的迁移现在已经与我们的部署分离了(这是一篇很好的文章,解释了从应用程序部署中分离数据库迁移的好处)。

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

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

相关文章
|
3月前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
3月前
|
Web App开发 前端开发 JavaScript
Playwright极速UI自动化实战指南
Playwright告别Selenium痛点,以智能等待、强大选择器、网络拦截与多设备模拟四大利器,提升自动化效率与稳定性。本文通过实战代码详解其加速秘籍,助你构建高效、可靠的UI测试方案。
|
4月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
2月前
|
弹性计算 人工智能 前端开发
在阿里云ECS上部署n8n自动化工作流:U2实例实战
本文介绍如何在阿里云ECS的u2i/u2a实例上部署开源工作流自动化平台n8n,利用Docker快速搭建并配置定时任务,实现如每日抓取MuleRun新AI Agent并推送通知等自动化流程。内容涵盖环境准备、安全组设置、实战案例与优化建议,助力高效构建低维护成本的自动化系统。
459 5
|
2月前
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
2月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
4月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
3月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
471 11
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
847 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
344 4