在某些情况下,AWS ELB 不会将请求分发到 Auto Scaling 组 EC2 实例

Posted

技术标签:

【中文标题】在某些情况下,AWS ELB 不会将请求分发到 Auto Scaling 组 EC2 实例【英文标题】:AWS ELB doesn't distribute requests to auto scaling group EC2 instances in some cases 【发布时间】:2014-01-02 07:19:44 【问题描述】:

我正在尝试使用 jmeter 为我的 AWS Auto Scaling 组进行性能测试。

首先,我进行了扩展/扩展测试。我将阈值设置为 2 个周期的 70% cpu 利用率,每个周期为 2 分钟。 ELB 工作正常,在系统横向扩展后,请求被分发到 Auto Scaling 组中的所有 EC2 实例,尽管不相等。

接下来,我想测试两个实例的负载是否可以是一个实例的两倍。 我固定了 Auto Scaling 组的实例数,我将 min/max/desired 实例数设置为 2。当我从单个 JMeter 推送负载时,总是只有一个实例在工作,它的 cpu 利用率几乎达到 100%,但是另一个实例的 cpu 利用率仍然为零....如果我从包含多个从属的 JMeter 集群推送负载,所有实例都会承担负载。

有人说,可能负载不够重,所以ELB认为只有一个实例可以处理它,并没有将请求分派给其他实例。我不这么认为,因为我只从这个 JMeter 集群的一个从属设备推送负载,但是我增加了负载,只有一个实例处理请求。

我发现一个博客说 ELB 在 HA 方面很棒,但在负载平衡方面不行。 https://www.stackdriver.com/elb-affinity-problems 但是,我认为只有一个实例处理请求的行为是不正常的。

ELB 负载均衡机制到底是什么鬼?我糊涂了。

【问题讨论】:

ELB 会将流量从同一个 IP 发送到同一个实例。确保您的负载测试使用多个 IP(如真实场景) 伙计,建议接受。感谢您的帮助! 【参考方案1】:

弹性负载平衡机制

DNS 服务器使用 DNS 轮询来确定特定可用区域中的哪个负载平衡器节点将接收请求 选定的负载平衡器检查“粘性会话”cookie 选定的负载均衡器将请求发送到负载最少的实例

更详细的:

可用区不太可能

默认情况下,负载均衡器节点将流量路由到同一可用区内的后端实例。为确保您的后端实例能够处理每个可用区中的请求负载,每个可用区中的实例数量大致相等非常重要。例如,如果您在可用区 us-east-1a 中有 10 个实例,在 us-east-1b 中有两个实例,则流量仍将在两个可用区之间平均分配。因此,us-east-1b 中的两个实例必须提供与 us-east-1a 中的十个实例相同的流量。

会话很可能是您的情况

默认情况下,负载均衡器将每个请求独立地路由到负载最小的服务器实例。相比之下,粘性会话将用户的会话绑定到特定的服务器实例,以便在会话期间来自用户的所有请求都将发送到同一个服务器实例。

当为应用程序启用粘性会话时,AWS Elastic Beanstalk 使用负载均衡器生成的 HTTP cookie。负载均衡器使用一个特殊的负载均衡器生成的 cookie 来跟踪每个请求的应用程序实例。当负载均衡器收到请求时,它首先检查请求中是否存在此 cookie。如果是,则将请求发送到 cookie 中指定的应用程序实例。如果没有 cookie,负载均衡器会根据现有的负载均衡算法选择一个应用实例。将 cookie 插入响应中,用于将来自同一用户的后续请求绑定到该应用程序实例。策略配置定义了一个 cookie 到期,它为每个 cookie 建立了有效期。

路由算法不太可能

负载均衡器节点使用 leastconns 路由算法将请求发送到同一可用区内的健康实例。 leastconns 路由算法偏爱具有最少连接或未完成请求的后端实例。

来源:Elastic Load Balancing Terminology And Key Concepts

希望对你有帮助。

【讨论】:

安德烈,感谢您的帮助。我发现如果不止一个 jmeter 发送请求,流量将被分配到实例。 Joe,即使从一个 IP ELB 获取请求,如果您没有打开“粘性会话”,也应该分配负载。【参考方案2】:

当后端实例位于不同的可用区域并且 ELB 接收来自少数客户端的请求时,我遇到了 ELB 流量不平衡的问题。在我们的例子中,我们在应用程序层中使用了一个内部 ELB。在您的情况下,“来自单个 JMeter 的推送负载”可能意味着 ELB 看到的少量客户端。解决方案是使用类似于此片段的 API 启用跨区域负载平衡:-

elb-modify-lb-attributes $ELB --region $REGION --crosszoneloadbalancing "enabled=true"

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-crosszone-lb.html

【讨论】:

以上是关于在某些情况下,AWS ELB 不会将请求分发到 Auto Scaling 组 EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用AWS自己的ELB证书进行HTTPS / SSL连接吗?

我可以使用 AWS 自己的 ELB 证书进行 HTTPS/SSL 连接吗?

TCP 模式下基于 AWS ELB 的 HTTP2

如何配置 AWS ELB 以阻止某些 IP 地址? (已知的垃圾邮件发送者)[关闭]

将 http 重定向到 https AWS 应用程序负载均衡器

通过 ELB 访问 AWS EC2 实例