如何在AWS Elastic Beanstalk部署新版本应用程序时防止停机时间?

29

我对Elastic Beanstalk的理解是,当您部署应用的新版本时,它会逐个将其部署到Amazon EC2实例(如果有多个)。 然而,即使有两个实例,当我上传新的.war文件并部署时,我的应用程序仍会遭受短暂停机时间,就像同时更新这两个实例一样。 我是否有办法确保没有停机时间,且一个实例在下一个开始之前完全更新并接受请求:以下是事件的示例。请注意,此时应用程序没有负载,因此在生产流量下情况只会变得更糟。

INFO
Environment update completed successfully.

INFO
New application version was deployed to running EC2 instances.

ERROR
The application did not respond at the health check URL.

INFO
Waiting for 8 seconds while EC2 instances download the updated application version.

INFO
Deploying version SomethingMore to 2 instance(s).
2个回答

23
为了实现这个目标,在Elastic Beanstalk中,您需要扩展部署流程来支持多个环境(请参阅AWS Elastic Beanstalk组件):

环境是部署到 AWS 资源上的版本。每个环境仅运行一个版本,但您可以在许多环境中同时运行相同版本或不同版本。有关环境和创建的资源的更多信息,请参见体系结构概述[强调我]

这个特性对于测试/调试分离的版本非常有用,但具体而言,它还可以实现环境的热切换,请参阅零停机时间部署版本以进行相应的操作步骤:

由于 AWS Elastic Beanstalk 在更新应用程序版本时执行就地更新,因此您将经历一些停机时间。但是,通过交换环境的 CNAME,可以避免这种停机时间。本节将向您介绍如何使用 AWS 管理控制台、命令行界面或 API 执行 CNAME 交换。[强调我]


谢谢,环境CNAME交换正是我所寻找的。 - Peter
6
我在生产应用程序上尝试了这个方法,并观察到即使交换了CNAME并等待DNS TTL过期,仍有相当一部分流量流向旧的Beanstalk环境。我怀疑这是因为客户端将DNS缓存保存的时间比应该保存的时间更长。如果不能指望客户端遵守TTL,则这种CNAME交换技术似乎不是一种可靠的使用Beanstalk进行零停机部署的方式。 - Aaron Iba
@AaronIba这是一个非常好的观察。你有想到一些替代方法吗?我考虑的是简单地覆盖现有的应用程序版本并手动关闭现有实例(ASG应该会逐渐启动新实例并拉取更新的应用程序版本)。但那是一个手动/缓慢/繁琐的过程,感觉像个hack。 - Tuukka Mustonen
1
是的,最终我运行了一个具有静态IP地址的HAProxy实例,它将流量转发到两个beanstalk后端之一。当我们执行ZDD时,我们会更新当前未使用的beanstalk后端,等待该更新完成,然后切换HAProxy实例以指向另一个后端。这很有效。同时,亚马逊发布了一个“滚动更新”功能,您可能需要了解一下:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rollingupdates.html - Aaron Iba

10

我知道这是一个老问题,但对于像我这样搜寻信息的人来说,Elastic Beanstalk在今天(2014年11月2日)发布了滚动应用版本部署。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html?sc_ichannel=em&sc_icountry=global&sc_icampaigntype=launch&sc_icampaign=em_125873140&sc_idetail=em_14124901705&ref_=pe_411040_125873140_8

这允许您更新一部分服务器组,使用新的应用程序,以确保始终有可用的主机来处理流量。


只有在负载均衡器后面运行多个实例才能起作用吗?从描述来看,似乎单个实例仍然会崩溃。 - Jonathan Tran
1
是的,在您的 Elastic Beanstalk 环境中需要多个实例以避免停机时间。这在任何地方都是如此;如果您从一个主机提供流量并更新主机(即使是就地更新),则会有一些停机时间的风险。 - zongweil
上述语句根本不是真的。我使用nginx在单个主机上进行了零停机部署。(没有使用弹性Beanstalk)。 - Jonathan Tran
1
新的“滚动附加批次”部署策略应该可以解决单实例配置的停机问题。 - jamix
“Rolling with additional batch”这个提示对我来说非常完美。请注意,现在有几个选项可用,请查看AWS公告获取简要说明和/或转到最新文档获取详细信息。 - leovrf
是的,但它不起作用。 单实例环境在使用滚动部署时仍会有停机时间。 - tar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接