我已经阅读了有关零停机时间部署版本(又名 CNAME 交换)的 AWS 文档。
正如 yegor256 在这个答案中解释的那样:
它唯一要做的就是交换两个 CNAME。例如,您有一个具有 CNAME foo-1.example.com 的环境 foo-1,另一个具有 CNAME foo-2.example.com 的 foo-2。交换操作环境 foo-1 将在 http://foo-2.example.com 响应。
所以问题是,你不是直接切换整个流量,而只是切换新流量。现有流量将继续使用以前的 CNAME 条目长达 TTL 秒,使两个版本在这短时间内共存(根据 Arun Kumar 的说法为 300 秒或更长时间)。
当两个版本的应用程序可以共存时,这对我来说似乎是可以接受的。
但是,我们应用程序的某些版本包含数据库补丁,必须在旧版本取出后立即运行,并且在引入新版本之前运行。
因此,看起来CNAME交换对于我们正在做的事情来说还不够好,因为旧的应用程序版本会在数据库修补后中断。
理想情况下,我想:
- 始终保持相同的弹性负载均衡器
- 让 Elastic Beanstalk 使用新的应用程序版本启动一个或多个实例
- 从 ELB 中删除现有实例(使用旧应用程序版本)
- 修补数据库
- 将新启动的实例(使用新的应用程序版本)添加到 ELB
这将最大限度地减少停机时间,只有当有补丁要应用时,才有几秒钟的503 Service Unavailable
。
这可能吗?还是我没有正确看到整个画面,我是否错过了更简单的解决方案?
可用于在 Elastic Beanstalk 上执行零停机部署的其他策略: http://www.hudku.com/blog/demystified-zero-downtime-with-amazon/