我正在使用 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/774411,https://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}}"
或者
使用控制台启用跨区域负载平衡
打开 Amazon EC2 控制台https://console.aws.amazon.com/ec2/。
在导航窗格上的 LOAD BALANCING 下,选择 Load Balancers。
选择您的负载均衡器。
在描述选项卡上,选择更改跨区域负载平衡设置。
在配置跨区域负载均衡页面上,选择启用。
选择保存。
答案2
运行时,nslookup dualstack.app.elb.us-east-2.amazonaws.com
您正在查询 DNS,它会返回每个已注册可用区域中的弹性负载均衡器节点的 IP 地址。然后,您的客户端应用程序将决定使用哪个 IP 来处理其请求。
如果您直接向弹性负载均衡器节点 IP 发出请求但未收到响应,则表示该可用区域中没有目标响应该节点的请求
引用以供参考,格式已修正
路由算法
和应用程序负载均衡器,接收请求的负载均衡器节点使用以下流程:
- 按优先级顺序评估侦听器规则以确定应用哪条规则。
- 使用为目标组配置的路由算法,从目标组中为规则操作选择一个目标。默认路由算法是循环路由。即使一个目标已在多个目标组中注册,也会为每个目标组独立执行路由。
和网络负载均衡器,接收连接的负载均衡器节点使用以下流程:
- 使用流哈希算法从目标组中为默认规则选择一个目标。该算法基于以下条件:
- 协议
- 源 IP 地址和源端口
- 目标 IP 地址和目标端口
- TCP 序列号
- 在连接生命周期内将每个单独的 TCP 连接路由到单个目标。来自客户端的 TCP 连接具有不同的源端口和序列号,并且可以路由到不同的目标。
和传统负载均衡器,接收请求的负载均衡器节点按如下方式选择注册实例:
对 TCP 侦听器使用循环路由算法
对 HTTP 和 HTTPS 侦听器使用最少未完成请求路由算法
答案3
当您在其中一个可用区中没有任何健康的目标实例时,就会发生这种情况。请检查两个可用区中的目标实例。