如何通过包括数据库补丁的 Elastic Beanstalk 部署避免停机?

Posted

技术标签:

【中文标题】如何通过包括数据库补丁的 Elastic Beanstalk 部署避免停机?【英文标题】:How to avoid downtime with Elastic Beanstalk deployments including database patches? 【发布时间】:2013-09-22 13:59:49 【问题描述】:

我已阅读有关 Deploying Versions with Zero Downtime 的 AWS 文档,也就是 CNAME 交换

正如yegor256 在this answer 中解释的那样:

它唯一做的就是交换两个 CNAME。例如,您有一个环境 foo-1 的 CNAME foo-1.example.com,另一个环境 foo-2 的 CNAME foo-2.example.com。 swap 运行环境后 foo-1 会回复http://foo-2.example.com。

所以问题是,您不会立即切换整个流量,而只是切换新流量。现有流量将继续使用之前的 CNAME 条目长达 TTL 秒,从而使两个版本在这段短时间内共存(300 秒或更长时间according to Arun Kumar)。

这对我来说看起来可以接受当应用程序的两个版本可以共存时

但是,我们的应用程序的某些版本包含数据库补丁,必须在旧版本被取出后和新版本引入之前立即运行。

所以看起来 CNAME 交换对于我们正在做的事情来说还不够好,因为旧的应用程序版本会在数据库修补后中断。

理想情况下,我想:

始终保持相同的弹性负载均衡器 让 Elastic Beanstalk 使用新应用版本启动一个或多个实例 从 ELB 中移除现有实例(使用旧应用版本) 修补数据库 将新启动的实例(带有新应用版本)添加到 ELB

这会将503 Service Unavailable 的停机时间缩短到几秒钟,只有在需要应用补丁时

这可能吗?还是我没有正确地看到整个画面,我错过了一个更简单的解决方案?

【问题讨论】:

【参考方案1】:

您可以使用以下一些其他策略在 Elastic Beanstalk 上执行零停机时间部署:http://www.hudku.com/blog/demystified-zero-downtime-with-amazon/

【讨论】:

我错了:/...对不起。 我对 DNS 之类的东西不是很自信,但是由于 Route 53 现在支持 ELB 的别名(您可以将 ELB 设置为别名目标),是否仍然存在与TTL? 有,但是在客户端:刚访问过网站的客户端会缓存DNS条目长达TTL秒,所以即使立即应用Route53修改,也会影响新客户端,但不会立即影响刚刚访问该页面的客户!

以上是关于如何通过包括数据库补丁的 Elastic Beanstalk 部署避免停机?的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 安全补丁

尝试通过 Elastic Bean 在 AWS 上部署我的应用程序时出错

如何在aws elastic bean上安装redis和celery

Elastic 7.13.0 版重磅发布:在 Elastic 上搜索和存储更多数据

Elastic 7.13.0 版重磅发布:在 Elastic 上搜索和存储更多数据

将 MongoDB 与 AWS Elastic Bean 应用程序一起使用