HTTP负载均衡下的TCP连接和流量路由

TCP connections and traffic routing under HTTP load balancing

我想弄清楚 HTTP 流量的负载均衡器预期接收/转发/重定向。

考虑以下两种不同的 HTTP 流量场景。

  1. Single HTTP request 有效负载的大小明显超过 single TCP IP包(即请求需要很多网络包)
  2. 多个 HTTP 请求 single persistent TCP connection

他们每个人:

这取决于协议吗? (例如,HTTP 请求与 WebSocket)?或者这些协议是否要求 TCP 连接始终可用,负载均衡器在 WebSocket 连接或请求-响应 HTTP 传输的整个持续时间内接收和转发所有 IP 流量?

视情况而定。

有像 HAProxy 这样的应用层负载平衡器,其中完整的 HTTP 请求和响应通过代理传递。这里有两个独立的 TCP 连接:一个在客户端和负载均衡器之间,另一个在负载均衡器和上游服务器之间。上游服务器的选择可以根据 HTTP 请求的内容来完成,例如 Host header and/or 路径以及 session cookie - 以确保相同的 session 总是由相同的上游服务器处理。如果上游服务器的决定是在 HTTP 请求上完成的,那么与上游服务器的连接只能在读取 HTTP 请求后建立,因为之前不知道。但请求不需要在单个数据包内。

有些网络或传输层负载平衡器根本不作用于数据包负载。相反,上游服务器的选择通常是根据客户端 IP 完成的,因此同一个客户端最终会出现在同一个上游服务器上。在这种情况下,使用哪个上游的决定已经在第一个数据包上完成(即 SYN 开始 TCP 握手)并且客户端基本上直接与​​上游代理建立连接 - 负载均衡器仅像路由器一样转发数据包。 HTTP 请求的大小在这里也无关紧要,因为甚至没有检查 TCP 负载来做出路由决定。

对于网络或传输层负载均衡器,可能存在非对称路由,即响应可能采用不同的方式,而不通过负载均衡器。通过应用层负载平衡,响应通过负载平衡器返回。