我已经阅读了 AWS 文档关于Deploying Versions with Zero Downtime,也就是CNAME swapping。
它唯一做的就是交换两个 CNAME。例如,您有一个环境 foo-1 的 CNAME foo-1.example.com,另一个环境 foo-2 的 CNAME foo-2.example.com。交换运行环境 foo-1 后会在http://foo-2.example.com响应。
所以问题是,你并没有立即切换整个流量,而只是切换新流量。现有流量将继续使用之前的 CNAME 条目长达 TTL 秒,从而使两个版本在这段短时间内共存(根据 Arun Kumar的说法,300 秒或更长时间)。
当应用程序的两个版本可以共存时,这对我来说是可以接受的。
但是,我们的应用程序的某些版本包含数据库补丁,必须在旧版本被取出后和新版本引入之前立即运行。
所以看起来 CNAME 交换对于我们正在做的事情来说还不够好,因为旧的应用程序版本会在数据库修补后中断。
理想情况下,我想:
- 始终保持相同的弹性负载均衡器
- 让 Elastic Beanstalk 使用新应用程序版本启动一个或多个实例
- 从 ELB 中移除现有实例(使用旧应用版本)
- 修补数据库
- 将新启动的实例(带有新应用版本)添加到 ELB
这会将停机时间减少到只有几秒钟503 Service Unavailable
,只有当有补丁需要应用时。
那可能吗?还是我没有正确地看到整个画面,我错过了一个更简单的解决方案?