【发布时间】:2017-01-05 06:01:46
【问题描述】:
我正在为我的 node.js express.js 应用程序测试 Elastic Beanstalk。当我部署更新时,应用程序会关闭几秒钟,并且我从 ngnix 得到“坏网关”。
这是因为我现在只有 1 个实例吗?我如何为生产做好准备?与零停机时间一样。
【问题讨论】:
标签: amazon-web-services amazon-elastic-beanstalk
我正在为我的 node.js express.js 应用程序测试 Elastic Beanstalk。当我部署更新时,应用程序会关闭几秒钟,并且我从 ngnix 得到“坏网关”。
这是因为我现在只有 1 个实例吗?我如何为生产做好准备?与零停机时间一样。
【问题讨论】:
标签: amazon-web-services amazon-elastic-beanstalk
即使在具有超过 1 个实例的 Elastic Beanstalk 环境中,您也会得到相同的不良行为。原因是所有实例都可能同时运行更新过程。
如果您想避免这种停机时间,Elastic Beanstalk 上有一个名为交换 URL 的内置功能。这是蓝绿部署策略的一个非常简单的实现。
基本上,在蓝绿部署策略中,您有 2 组资源:蓝色资源和绿色资源。假设最初,Blue 资源正在接收和处理生产流量。该策略的工作原理如下:(1)您将应用程序的新版本部署到绿色资源中; (2) 您运行任何您可能需要的热身程序(如果有的话); (3) 您使用某种“流量管理器”将生产流量发送到您的绿色资源; (4) 一旦所有流量从蓝色资源迁移到绿色资源,您可以选择关闭蓝色资源。
在 Elastic Beanstalk 中,您需要 2 个环境。假设我们有 2 个具有以下名称和 URL 的环境:
第一个环境名为Env-Blue,URL 为myapp-prod.elasticbeanstalk.com。
第二个环境名为Env-Green,URL 为myapp-staging.elasticbeanstalk.com。
我们还假设您有自己的域名www.myapp.com,它指向myapp-prod.elasticbeanstalk.com。您目前在 Env-Blue 上运行 v1.0,并且正在努力推出 v1.1。
当您准备好部署 v1.1 时,您将其部署到 Env-Green 中——您这样做是因为它是当前的“临时”环境。然后您可以连接到它,确保它完全按照您的要求工作。
最后,在 Elastic Beanstalk 上选择这两个环境并选择交换 URL 功能。您的环境将如下所示:
第一个环境名为 Env-Blue,URL 为 myapp-staging.elasticbeanstalk.com,运行旧的 v1.0。
名为Env-Green 的第二个环境,URL 为myapp-prod.elasticbeanstalk.com,运行新的v1.1。
由于www.myapp.com 仍指向myapp-prod.elasticbeanstalk.com,因此连接到www.myapp.com 的用户现在将被发送到运行v1.1 的Env-Green。随着用户刷新 DNS 缓存,他们将逐渐迁移到 v1.1。
最后一点非常重要:要使此策略正常工作,为您的域记录配置适当的 TTL 非常重要。如果它太长,您的用户可能会缓存您的 DNS 很长时间,并且需要一段时间才能迁移。在此期间,您必须保持 2 组资源运行(您需要为此付费)。
【讨论】:
尝试将部署策略切换为不可变。您可能将其设置为“一次性”,这将更新现有实例并导致您在发生这种情况时遇到停机时间。
使用不可变部署策略,Elastic Beanstalk 将创建一个新实例并确保它在切换之前运行良好。
见http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deploy-existing-version.html
【讨论】:
Bruno 的正确想法是使用蓝绿部署来实现零停机时间。
根据我的经验,一旦您交换了网址,最多可能需要 20 分钟才能将所有活动连接从旧环境转移到新环境。这是因为即使您的 TTL 设置得很低,浏览器通常也会缓存 DNS 长达 15 分钟。
我监控旧环境,直到连接断开。
另一个好处是,如果您在这 20 分钟的冷静期内发现新部署的构建有问题,您可以通过再次点击交换 URL 立即“回滚”以切换回之前的环境;)
【讨论】: