Aurora Serverless 蓝/绿部署

Aurora Serverless 蓝/绿部署

我目前正在研究使用 RDS Aurora Serverless for Mysql 实现蓝/绿部署的策略。

我正在考虑的两种方法是:

A。创建重复数据库并将重复数据库迁移到新架构。基本上,我会保留两个版本的数据库,直到部署完成,然后删除原始数据库。

B.始终保持相同的数据库,并或多或少同时支持两种模式。这意味着如果我想更改列名,我会做一些事情,比如保留重复的列,这样我的旧查询就可以继续适用于我的应用程序的旧版本和新版本。

我对这两者可行性有几个疑问:

  1. 对于方法A,是否有合理的方法使用 Aurora Serverless 复制数据库?我的理解是快照不能用于创建重复的数据库。
  2. 对于方法A有哪些方法可以使两个数据库保持同步。(我认为使用 Kinesis 可能会有效)
  3. 对于方法,有哪些选项可以使重复的列/表保持同步。对于新版本的 API 用户来说,只需更新两个列就相当简单了,但我不确定如何处理不知道新列存在的旧版本的 API。

我也愿意接受有关不同策略的建议。

答案1

创建数据库副本对于每次部署(方法 A)是相当复杂的方法

它仅当您的数据库满足以下条件时才有效:相当小(复制需要时间,保留 2 个大型 DB(蓝色和绿色)需要花费 2 倍的钱,等等),相当静态写入很少(保持两者同步对于繁忙的数据库来说可能是一个挑战),并且当你不要指望回滚(从繁忙的新绿色 DB回到旧蓝色DB可能会很复杂)。

这是可以做到的,但很复杂。AWS 数据库迁移服务 (DMS)它可以同时完成初始复制并随后保持 DBS 同步,这可以解决其中的一些问题。


对蓝色和绿色使用相同的 DB(你的方法 B) 是通常优先并且更容易使用。实际上大多数时候数据库字段都是添加在代码发布之间,它们很少删除或者改名. 但即使这样也是可以做到的。

假设您出于某种原因想要重命名某个username字段user_name,例如,为了使其符合新的命名约定。您可以执行以下操作:

  1. 代码版本 1期望username并且数据库模式有username字段。

  2. 添加user_name默认列NULL

  3. 部署代码版本 2- 它会尝试进行身份验证user_name,如果发现是,user_nameNULL会返回username并更新user_name。如果创建了新用户,它会保存到user_name并在单独的步骤中更新到username

    如果访问旧username列失败,因为它不再是现有列,那也没关系。

  4. 一次版本 2已完全部署并测试运行一个脚本,该脚本可更新所有剩余的user_nameusername

  5. 部署版本 3仅适用于user_name

  6. 一次版本 3部署后会删除旧列,username因为当前(v3)和以前的(v2)都可以在没有旧列的情况下工作。

这可能看起来很复杂但其实并没有那么糟糕。

这种方法有许多优点:

  • 这只是软件工程问题,您的 CI/CD 管道不必支持复制和同步数据库并将其回滚。

  • 大多数情况下,软件发布后数据库不会发生变化,如果有变化,通常只有添加新列,这是简单且向后兼容的。

  • 如果你决定使用,也可以使用同样的方法滚动部署或者金丝雀部署代替蓝绿将来。

希望有帮助:)

相关内容