我在应用程序性能测试期间发现一个问题。该问题是 LoadBalancer 无法将客户端和 LB 之间的 TCP 连接与 LB 和支持实例之间的 TCP 连接进行映射。
当客户端首次发送 http 请求时,LB 会与后端实例建立新的 TCP 连接,但当同一客户端发送另一个 http 请求时,LB 也会与后端实例建立新的 TCP 连接。当我们执行相同的场景时,直接从客户端向后端实例发送请求,相同的 TCP 连接将被重用。
我们对支持实例中每个进程的打开 TCP 连接数有所限制,因此我们想了解以下内容。
为什么 LB 在向后端服务器发送请求时使用 IP 范围以及它在哪里配置?LB 如何将客户端 TCP 连接与后端 TCP 连接进行映射?如果没有映射,那么 LB 对打开的 TCP 连接的限制是多少。如果后端实例重置连接,LB 返回的响应代码是什么?如果后端服务器的 SYN 积压队列已满,LB 返回的响应代码是什么。
答案1
这些问题似乎已经得到解答这次讨论。我在此重新发布提供的答案:
“客户端请求由一组负载均衡器处理,这就是为什么在处理来自客户端的请求流时会看到直接连接主机的变化。
来自客户端 IP 的流量将由全局负载均衡器池的子集处理,但从您的问题来看,即使是这个子集最终也太大,无法导致后端 TCP 连接重用率高。负载均衡器有一些隐藏参数会影响到后端的连接数量以及负载均衡器可以使用现有连接处理新请求的情况。这些内部参数将来可能会发生变化,以减少负载均衡器和后端之间所需的 TCP 连接数。在此之前,允许在后端建立更多连接并对这些连接设置更宽松的超时时间应该会增加后端连接重用率。
通过客户端 IP 或生成的 Cookie 启用会话亲和性将导致 LB 在处理来自客户端的流量时使用特定的后端,但您仍会看到来自多个 LB IP 的流量。在没有会话亲和性的情况下,客户端 IP 和使用的后端 VM 之间实际上没有映射。有关如何启用会话亲和性的说明,请参阅: https://cloud.google.com/compute/docs/load-balancing/http/#session_affinity
如果无法从后端获取响应,LB 将回复 502 响应代码。负载均衡器将认为后端不健康,并将流量引导至其他可用的健康后端。如果没有健康的后端,负载均衡器将在超时后回复 502。