![如何临时重定向来自弹性负载均衡器的流量?](https://linux22.com/image/618159/%E5%A6%82%E4%BD%95%E4%B8%B4%E6%97%B6%E9%87%8D%E5%AE%9A%E5%90%91%E6%9D%A5%E8%87%AA%E5%BC%B9%E6%80%A7%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E7%9A%84%E6%B5%81%E9%87%8F%EF%BC%9F.png)
我在 Elastic Beanstalk 上运行一个应用程序,每当我需要部署新版本时,我都需要:
- 在 Elastic Beanstalk 上部署版本,大约需要一分钟
- 使用新版本附带的任何 SQL 补丁来修补数据库,这需要额外几秒钟
在此期间,我希望 ELB 停止将流量重定向到 EC2 实例,并且仅在安全的情况下(当软件和数据库版本匹配时)将流量带回给它们。
是否可以暂时将 ELB 的流量重定向到其他地方?例如,执行 HTTP 重定向到 S3 存储桶,还是从该存储桶而不是 EC2 实例读取?
我知道我可以通过 DNS 更改来做到这一点,但这些更改需要额外的时间来传播,即使 TTL 较低,我仍然无法保证客户端会正确遵守 TTL 并在我进行更新后立即到达正确的服务器。
因此理想情况下,DNS 应该始终指向 ELB,然后 ELB 应该在升级时实时将流量切换到其他地方。
答案1
据我所知,没有办法这样做。
然而,我找到了一个可以满足我所有要求的替代解决方案。
我更新了我的应用程序的前端控制器来读取环境变量,APP_MAINTENANCE
并且503 Service Unavailable
如果该变量是,则返回响应TRUE
。
数据库修补通过以下方式运行容器命令并且在部署期间是自动的。
现在部署过程如下,使用Elastic Beanstalk API:
- 使用更新环境设置
APP_MAINTENANCE
为TRUE
- 等到环境准备就绪(使用描述环境)
- 用于
UpdateEnvironment
部署新的应用程序版本 - 等到环境准备就绪
- 使用
UpdateEnvironment
设置APP_MAINTENANCE
为FALSE
。
这样,我可以确保在数据库升级期间没有任何程序在使用数据库。在此时间段内(大约 3 分钟),应用程序不可用,并且任何请求都会返回响应503
,这在我的用例中是可以接受的。
任何收到此响应的客户端都会被邀请在几分钟后重试,无论是真实的人(友好消息会邀请这样做),还是 API 使用者(HTTP 表明这是一个暂时的故障,客户端应该稍后重试)。
答案2
您可以使用交换环境 URL,如下所述:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.CNAMESwap.html
将新版本加载到第二个 beanstalk 并交换 URL 或将维护站点部署到第二个 beanstalk 并交换到它 - 所有流量都重定向到新环境。
答案3
您还可以在负载均衡器上设置安全组以暂时阻止公共访问。虽然不太优雅,但确实有效。