在某些情况下,AWS ELB不会将请求分发到自动扩展组EC2实例

时间:2013-12-14 15:09:06

标签: amazon-web-services jmeter autoscaling amazon-elb

我正在尝试使用jmeter对我的AWS自动缩放组进行性能测试。

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

接下来,我想测试两个实例的加载是否是一个实例的两倍。 我修复了自动缩放组的实例编号,我将最小/最大/期望实例计数设置为2.当我从单个JMeter推送负载时,总是只有一个实例工作且其cpu利用率几乎达到100%,但是另一个实例的cpu利用率仍为零....如果我从包含多个从属的JMeter集群推送负载,则所有实例都会加载。

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

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

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

2 个答案:

答案 0 :(得分:3)

弹性负载平衡机制

  • DNS服务器使用DNS循环来确定特定可用区域中的哪个负载均衡器节点将收到请求
  • 选定的负载均衡器会检查“粘性会话”Cookie
  • 选定的oad balancer将请求发送到负载最少的实例

更详细的说明:

可用区不太可能是您的情况

默认情况下,负载均衡器节点将流量路由到同一可用区内的后端实例。为确保后端实例能够处理每个可用区中的请求负载,在每个区域中拥有大约相等数量的实例非常重要。例如,如果在可用区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

希望它有所帮助。

答案 1 :(得分:1)

当后端实例处于不同的可用区域且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