我正在测试我的node.js express.js应用程序的Elastic Beanstalk。当我部署更新时,应用程序停机几秒钟,我从ngnix获得“坏网关”。
这是因为我现在只有1个实例吗?我如何准备好生产?如在零停机时间。
答案 0 :(得分:8)
即使具有多个实例的Elastic Beanstalk环境,您也可能会遇到相同的不良行为。原因是可能会发生所有实例同时运行更新过程。
如果您想避免停机,Elastic Beanstalk上有一个名为交换网址的内置功能。这是 Blue-Green部署策略的一个非常简单的实现。
基本上,在蓝绿色部署策略中,您有两组资源:蓝色资源和绿色资源。假设,最初,Blue资源正在接收和处理生产流量。该策略的工作原理如下:(1)将新版本的应用程序部署到绿色资源中; (2)如果你有任何预备程序,你可以进行任何预热程序; (3)您使用某种“流量管理器”将生产流量发送到您的绿色资源; (4)一旦所有流量从Blue资源迁移到Green资源,您可以选择关闭Blue资源。
在Elastic Beanstalk中,您需要2个环境。假设我们有2个具有以下名称和URL的环境:
第一个名为Env-Blue
的环境,网址为myapp-prod.elasticbeanstalk.com
。
名为Env-Green
的第二个环境,网址为myapp-staging.elasticbeanstalk.com
。
我们还假设您拥有自己的域名www.myapp.com
,该域名指向myapp-prod.elasticbeanstalk.com
。您目前正在Env-Blue上运行v1.0,并且正在努力将v1.1推出。
当您准备部署v1.1时,将其部署到Env-Green中 - 您这样做是因为它是当前的“临时”环境。然后你可以连接到它,确保它完全按你想要的那样工作。
最后,在Elastic Beanstalk上选择两个环境并选择“交换网址”功能。您的环境将如下所示:
名为Env-Blue
的第一个环境,网址为myapp-staging.elasticbeanstalk.com
,运行旧的v1.0。
名为Env-Green
的第二个环境,网址为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,并且需要一段时间才能迁移。在此期间,您必须保持两组资源运行(您需要付费)。
答案 1 :(得分:4)
尝试将部署策略切换为Immutable。你可能把它设置为" All at Once"这将更新现有实例,并使您在发生这种情况时遇到停机。
使用不可变部署策略,Elastic Beanstalk将在切换之前创建一个新实例并确保它是健康的。
请参阅http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deploy-existing-version.html
答案 2 :(得分:1)
布鲁诺有正确的想法使用Blue-Green部署以实现零停机时间。
根据我的经验,一旦你交换了网址,可能需要20分钟才能将旧环境中的所有活动连接耗尽到新环境。这是因为即使您的TTL设置为低,浏览器通常会将DNS缓存最多15分钟。
我监视旧环境,直到连接断开。
另外一个好处是,如果您在这个20分钟的冷静期内发现新部署的构建有问题,您可以通过再次点击交换URL立即“回滚”以切换回以前的环境;)