Java 客户端通过多个可用区向 NLB 发送的请求未实现负载平衡
概括:
期望:来自 Java 的每个请求都在两个节点之间进行负载平衡。
实际行为:所有请求仅发送到一个节点,而两个节点均可用。
为什么会出现这种情况?在这种情况下,实现负载平衡的最佳策略是什么?
细节:
我有一个如下图所示的网络。 图像:一个 NLB 位于两个 AZ 上。每个 AZ 都有一个节点。 Java 应用向 NLB 发出 http 请求。此 NLB 配置在两个可用区上,因此每个可用区都有一个端点。每个可用区都有一个侦听 https 的 EC2 实例。
初步分析:
到目前为止,我知道三个问题:
- 默认情况下,NLB 端点仅将请求转发到同一可用区内的节点。此行为可以通过“跨区域负载平衡”选项进行修改。我担心启用此选项可能会导致不良的子效应。
- 请求是 https,开启
Keep-Alive
。除非有人断开连接,否则连接将被重用,这可能会导致粘连到一个节点。 - NLB 负载均衡是通过 DNS 轮询实现的,暂且不论 1 中提到的跨区域负载均衡。同时,Java 应用程序默认缓存 DNS 查询结果。通过 JVM 设置禁用它
networkaddress.cache.ttl=0
可能会每次都强制进行 DNS 查询。但我担心这可能会导致 DNS 泛洪或类似情况,这对网络不利。
我尝试启用“跨区域负载平衡”并添加“Connection:close”请求标头,以避免 1) 和 2)。 初次尝试似乎不错,但不确定是否正确,尤其是在请求较大或高负载情况下等。