我目前正在研究使用 RDS Aurora Serverless for Mysql 实现蓝/绿部署的策略。
我正在考虑的两种方法是:
A。创建重复数据库并将重复数据库迁移到新架构。基本上,我会保留两个版本的数据库,直到部署完成,然后删除原始数据库。
B.始终保持相同的数据库,并或多或少同时支持两种模式。这意味着如果我想更改列名,我会做一些事情,比如保留重复的列,这样我的旧查询就可以继续适用于我的应用程序的旧版本和新版本。
我对这两者可行性有几个疑问:
- 对于方法A,是否有合理的方法使用 Aurora Serverless 复制数据库?我的理解是快照不能用于创建重复的数据库。
- 对于方法A有哪些方法可以使两个数据库保持同步。(我认为使用 Kinesis 可能会有效)
- 对于方法乙,有哪些选项可以使重复的列/表保持同步。对于新版本的 API 用户来说,只需更新两个列就相当简单了,但我不确定如何处理不知道新列存在的旧版本的 API。
我也愿意接受有关不同策略的建议。
答案1
创建数据库副本对于每次部署(方法 A)是相当复杂的方法。
它仅当您的数据库满足以下条件时才有效:相当小(复制需要时间,保留 2 个大型 DB(蓝色和绿色)需要花费 2 倍的钱,等等),相当静态写入很少(保持两者同步对于繁忙的数据库来说可能是一个挑战),并且当你不要指望回滚(从繁忙的新绿色 DB回到旧蓝色DB可能会很复杂)。
这是可以做到的,但很复杂。AWS 数据库迁移服务 (DMS)它可以同时完成初始复制并随后保持 DBS 同步,这可以解决其中的一些问题。
对蓝色和绿色使用相同的 DB(你的方法 B) 是通常优先并且更容易使用。实际上大多数时候数据库字段都是添加在代码发布之间,它们很少删除或者改名. 但即使这样也是可以做到的。
假设您出于某种原因想要重命名某个username
字段user_name
,例如,为了使其符合新的命名约定。您可以执行以下操作:
代码版本 1期望
username
并且数据库模式有username
字段。添加
user_name
默认列NULL
部署代码版本 2- 它会尝试进行身份验证
user_name
,如果发现是,user_name
它NULL
会返回username
并更新user_name
。如果创建了新用户,它会保存到user_name
并在单独的步骤中更新到username
。如果访问旧
username
列失败,因为它不再是现有列,那也没关系。一次版本 2已完全部署并测试运行一个脚本,该脚本可更新所有剩余的
user_name
行username
。部署版本 3仅适用于
user_name
。一次版本 3部署后会删除旧列,
username
因为当前(v3)和以前的(v2)都可以在没有旧列的情况下工作。
这可能看起来很复杂但其实并没有那么糟糕。
这种方法有许多优点:
这只是软件工程问题,您的 CI/CD 管道不必支持复制和同步数据库并将其回滚。
大多数情况下,软件发布后数据库不会发生变化,如果有变化,通常只有添加新列,这是简单且向后兼容的。
如果你决定使用,也可以使用同样的方法滚动部署或者金丝雀部署代替蓝绿将来。
希望有帮助:)