为什么我的 AWS NLB 的多个地址记录中一次只有一个能起作用?

为什么我的 AWS NLB 的多个地址记录中一次只有一个能起作用?

我正在使用 AWS 网络负载均衡器。当我发出 时nslookup dualstack.app.elb.us-east-2.amazonaws.com,输出为

Non-authoritative answer:
Name:   dualstack.app.elb.us-east-2.amazonaws.com
Address: 3.xxx.xxx.176
Name:   dualstack.app.elb.us-east-2.amazonaws.com
Address: 18.xxx.xxx.40

我注意到这些 IP 都位于不同的可用区域,并且一次只有一个 IP 有效。dualstack.app.elb.us-east-2.amazonaws.com/healthcheck通过 via发出curl请求只有一半的时间有效。但是,从我的浏览器发出相同的请求 100% 有效,因为 chrome 有自己的处理循环 DNS 的方法(相关:https://serverfault.com/a/774411https://serverfault.com/a/852421

这是 NLB 的预期行为吗?即当存在多个 IP 时,预计一次只有其中一个可以工作?

答案1

上面的答案告诉你为什么,但没有告诉你如何解决。你说你正在使用 ELB,这通常是指经典的 ELB,而不是 ALB/NLB。使用 ELB,你启用跨区域负载平衡。它默认通过 ALB 启用,因此如果您使用其中一个,这不是适合您的正确答案 - 请更新您的问题并让我知道是否是这种情况。

aws elb modify-load-balancer-attributes --load-balancer-name my-loadbalancer --load-balancer-attributes "{\"CrossZoneLoadBalancing\":{\"Enabled\":true}}"

或者

使用控制台启用跨区域负载平衡

  1. 打开 Amazon EC2 控制台https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Load Balancers。

  3. 选择您的负载均衡器。

  4. 在描述选项卡上,选择更改跨区域负载平衡设置。

  5. 在配置跨区域负载均衡页面上,选择启用。

  6. 选择保存。

答案2

运行时,nslookup dualstack.app.elb.us-east-2.amazonaws.com您正在查询 DNS,它会返回每个已注册可用区域中的弹性负载均衡器节点的 IP 地址。然后,您的客户端应用程序将决定使用哪个 IP 来处理其请求。

如果您直接向弹性负载均衡器节点 IP 发出请求但未收到响应,则表示该可用区域中没有目标响应该节点的请求

https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html#request-routing

引用以供参考,格式已修正

路由算法

应用程序负载均衡器,接收请求的负载均衡器节点使用以下流程:

  1. 按优先级顺序评估侦听器规则以确定应用哪条规则。
  2. 使用为目标组配置的路由算法,从目标组中为规则操作选择一个目标。默认路由算法是循环路由。即使一个目标已在多个目标组中注册,也会为每个目标组独立执行路由。

网络负载均衡器,接收连接的负载均衡器节点使用以下流程:

  1. 使用流哈希算法从目标组中为默认规则选择一个目标。该算法基于以下条件:
  • 协议
  • 源 IP 地址和源端口
  • 目标 IP 地址和目标端口
  • TCP 序列号
  1. 在连接生命周期内将每个单独的 TCP 连接路由到单个目标。来自客户端的 TCP 连接具有不同的源端口和序列号,并且可以路由到不同的目标。

传统负载均衡器,接收请求的负载均衡器节点按如下方式选择注册实例:

  • 对 TCP 侦听器使用循环路由算法

  • 对 HTTP 和 HTTPS 侦听器使用最少未完成请求路由算法

答案3

当您在其中一个可用区中没有任何健康的目标实例时,就会发生这种情况。请检查两个可用区中的目标实例。

相关内容