应用程序ELB在宽限期之前将流量路由到新添加的实例



我已经设置了"自动缩放"组,并将宽限期设置为300(5分钟)。我的新实例最多需要2.5分钟才能启动并准备好处理HTTP请求。但我注意到,每次添加我的新实例时,ELB甚至在宽限期(即5分钟)之前就开始向新实例转发流量。因此,我面临502坏网关错误。

有人能告诉我为什么我的应用程序负载均衡器会这样做吗?

我正在使用ELB类型的健康检查,下面是我的目标群体健康检查的设置

协议:HTTP

端口:80

健康阈值:2

不健康阈值:10

超时:10

间隔:150

成功代码:200

这是一种正常行为。宽限期并不是为了防止健康检查的发生。这对于ELB和EC2服务运行状况检查都适用。在您指定的宽限期内,ELB和EC2服务都将向您的实例发送健康检查。这里的区别在于,自动缩放不会对这些检查的结果起作用。这意味着自动缩放不会自动安排替换实例。

只有在实例正确启动并运行(通过ELB和EC2健康检查)后,ELB才会注册实例并开始向其发送正常流量。但这可能在宽限期到期之前发生。如果您在向ELB注册实例后看到502错误,那么您的问题就在其他地方。

最后我解决了我的问题。我在这里写我的解决方案是为了帮助其他面临同样问题的人。

在我的案例中,我最初的感觉是Application Load Balancer在准备好服务之前就将流量路由到新添加的实例。但详细的调查表明,这不是问题所在。在我的案例中,新实例能够在开始时提供流量,几分钟后,它生成了这个ELB级别502的错误,持续了大约30秒,之后它开始正常工作。

解决方案:应用程序的默认连接KeepAlive为60秒。Apache2的默认连接KeepAlive为5秒。如果5秒钟结束,Apache2将关闭其连接并重置与ELB的连接。然而,如果请求正好在正确的时间到来,ELB将接受它,决定将它转发到哪个主机,然后Apache关闭连接。这将导致所述502错误代码。

我将ELB超时设置为60秒,将Apache2超时设置为120秒。这解决了我的问题。

相关内容

最新更新