【问题标题】:How to prevent downtime during AWS Elastic Beanstalk deployment of a new version of the app?如何在 AWS Elastic Beanstalk 部署新版本应用程序期间防止停机?
【发布时间】:2012-07-15 18:07:44
【问题描述】:

我对@9​​87654321@ 的理解是,当您部署应用程序的新版本时,它会一次将其部署到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).

【问题讨论】:

    标签: deployment amazon-web-services amazon-ec2 production-environment amazon-elastic-beanstalk


    【解决方案1】:

    要在Elastic Beanstalk 中实现这一目标,您需要扩展部署过程以促进多个环境(请参阅AWS Elastic Beanstalk Components):

    环境是部署到 AWS 资源上的版本。每个 环境只运行一个版本,但是 您可以运行相同的版本 在多个环境中同时使用版本或不同版本。 [...] 为了 有关环境和资源的更多信息 创建,请参阅Architectural Overview[强调我的]

    此功能对于测试/调试单独的版本非常有用,但具体而言,这也可以实现环境的热交换,请参阅 Deploying Versions With Zero Downtime 以获取相应的演练:

    由于 AWS Elastic Beanstalk 在您执行就地更新时 更新您的应用程序版本,您将经历一些停机时间。 但是,可以通过交换 CNAME 来避免这种停机时间 适合您的环境。本节将引导您完成如何执行 使用 AWS 管理控制台、命令行进行 CNAME 交换 接口或 API。 [强调我的]

    【讨论】:

    • 谢谢,环境 CNAME 交换正是我想要的。
    • 我在我的生产应用程序上进行了尝试,发现即使在交换 CNAME 并等待 DNS TTL 过期之后,仍有相当一部分流量流向旧的 beanstalk 环境。我怀疑这是因为客户端保留 DNS 缓存的时间超过了应有的时间。如果不能依赖客户端来遵守 TTL,那么这种 CNAME 交换技术似乎不是使用 Beanstalk 进行 ZDD 部署的可靠方法。
    • @AaronIba 这是一个很好的观察。你有没有想出一些替代方法?我正在考虑简单地覆盖现有应用程序版本并手动关闭现有实例(ASG 应该增加新实例并提取更新的应用程序版本)。但这是手动/缓慢/繁琐的过程,感觉就像是 hack。
    • 是的,我最终运行了一个带有静态 IP 地址的 HAProxy 实例,该地址转发到两个 beanstalk 后端之一。当我们执行 ZDD 时,我们会更新当前未使用的 beanstalk 后端,等待该更新完成,然后切换 HAProxy 实例以指向另一个后端。它工作得很好。与此同时,亚马逊发布了一个“滚动更新”功能,你可能想看看:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
    【解决方案2】:

    我知道这是一个老问题,但对于谷歌搜索的人(比如我),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

    这允许您一次使用新应用程序更新部分队列,确保始终有主机可用于获取流量。

    【讨论】:

    • 这是否仅在您在负载均衡器后面运行多个实例时才有效?从它的描述来看,似乎单个实例仍然会下降。
    • 是的,您的 Elastic Beanstalk 环境中需要多个实例以避免停机。不过,这在任何地方都是正确的;如果您从一台主机提供流量并更新主机(即使它是就地的),您可能会面临一些停机时间。
    • 上述说法根本不正确。我已经使用 nginx 在单个主机上完成了零停机部署。 (不在弹性豆茎上。)
    • 新的“Rolling with additional batch”部署策略应该可以解决单实例配置的停机问题。
    • “滚动附加批次”提示对我来说是完美的。请注意,现在有几个选项可用,请查看AWS announcement 以获得简要说明和/或转到latest documentation 以获得深入信息。
    猜你喜欢
    • 2020-05-15
    • 2018-09-13
    • 2017-08-01
    • 2020-04-29
    • 2012-09-24
    • 2015-07-17
    • 2017-05-11
    • 2019-04-18
    • 2016-01-24
    相关资源
    最近更新 更多