更换ec2实例后,负载均衡器需要很长时间才能建立连接
Posted
技术标签:
【中文标题】更换ec2实例后,负载均衡器需要很长时间才能建立连接【英文标题】:Load balancer takes a long time to establish a connection after ec2 instance replacement 【发布时间】:2020-01-12 08:15:42 【问题描述】:我试图解决的原始问题是,当负载均衡器开始将请求转发到新初始化的 ec2 实例时,对该新实例的第一个请求大约需要 10 秒。后续请求很好(同一请求约 100 毫秒)。在我替换负载均衡器中的 ec2 实例后,我还观察到浏览器需要很长时间才能加载 Web 应用程序。我认为这两个问题的根本原因可能相同,并且由于后一个问题更易于解释和测试,因此我将提供有关该问题的详细信息。
我在 AWS 中为此测试设置了以下基础设施:
AMI 包含托管在 IIS 中的 Web 应用程序 指向具有所需容量 = 1 的 AMI 的 ASG 具有适当健康检查的目标群体 应用负载平衡器这是我运行的测试:
终止 ASG 中的 ec2 实例 等待 ASG 替换 ec2 实例 等到 ASG 报告该新实例运行状况良好 在 Incognito Chrome 浏览器中通过 ec2 实例 IP 直接加载 Web 应用程序(无负载平衡器) - 加载时间 通过 Incognito Chrome 浏览器中的负载平衡器加载 Web 应用程序 - 大约需要 20 秒我可以重复这个测试一段时间,通常会得到相似的结果。最终,看起来像是“点击”了一些东西,网站开始通过负载平衡器快速加载。
什么可能导致这种行为?我们可以在负载均衡器配置中进行更改以解决此问题吗?如上所述,当通过 ec2 IP 地址直接访问时,Web 应用程序加载速度非常快,因此这不是应用程序本身的问题。
【问题讨论】:
您在 LB 中的健康检查设置是什么? 绑定到 LB 的目标组在应用程序的 *.aspx 页面上定义了健康检查。我认为我们在该健康检查上使用默认设置:协议 = HTTP,端口 = 流量端口,健康阈值 = 5,不健康阈值 = 2,超时 = 5,间隔 = 30,成功代码 = 200。ASG 具有健康检查类型= EC2 和健康检查宽限期 = 300。我认为这就是所有健康检查设置。如果我忽略了什么,请告诉我。 【参考方案1】:是的,您可以控制负载均衡器的设置,以使用最低健康阈值标记目标健康。
您可以使用这些标志调整初始响应。
健康检查间隔
单个实例的健康检查之间的时间量,以秒为单位。
Valid values: 5 to 300
Default: 30
健康阈值
在声明 EC2 实例健康之前必须发生的连续成功的健康检查次数。
Valid values: 2 to 10
Default: 10
因此,使用默认值,实例将变为健康状态,即10*30
要调整这些配置,请将 HealthCheck Interval
更新为 5
并将 Healthy Threshold
更新为 2
,因此负载均衡器将需要 10*2
将目标标记为健康并将流量路由到端点。
elb-healthchecks 或 target-group-health-checks
【讨论】:
我不认为这是我的问题,至少不是全部。我按照您的建议更改了健康检查间隔 = 5 和阈值 = 2,然后重新运行了上面的测试。我观察到相同的行为,该网站第一次连接需要一段时间。然后连接很快。但是如果我关闭浏览器并在 5-10 分钟后返回重新加载页面,那么再次建立第一个连接需要一段时间。 ASG 和目标集团在此期间都表现良好。我正在调查子网可能存在的问题。 如果第一次需要时间,那么这不是基础设施问题,您使用的是哪个框架?您是否在前端启用了缓存? 这是一个托管在 IIS (c# .NET + JS) 中的 Web 应用程序。我认为这是 ALB 设置的一个问题,因为当通过 ec2 IP 地址直接访问时(即使是第一次),应用程序加载速度非常快。我只在通过负载均衡器访问时观察到这种行为。 后端实例的内存是多少?以及如何访问负载平衡器?使用托管在其他地方或来自 AW 的 DNS?尝试ns lookup DNs
然后获取负载均衡器的IP并尝试使用IP
您能发布这些指标吗?以上是关于更换ec2实例后,负载均衡器需要很长时间才能建立连接的主要内容,如果未能解决你的问题,请参考以下文章
使用 Terraform 关闭/打开 Elastic Beanstalk 负载均衡器?
如何将面向公众的负载均衡器连接到私有 VPC 中的 EC2 实例