HTTP负载均衡下的TCP连接和流量路由
TCP connections and traffic routing under HTTP load balancing
我想弄清楚 HTTP 流量的负载均衡器预期接收/转发/重定向。
考虑以下两种不同的 HTTP 流量场景。
- Single HTTP request 有效负载的大小明显超过 single TCP IP包(即请求需要很多网络包)
- 多个 HTTP 请求 single persistent TCP connection
他们每个人:
- 所有 网络流量(例如 TCP IP 数据包)是否会通过负载平衡器本身? (即负载均衡器“像电缆一样”看到并转发所有流量可以这么说)
- 或者负载均衡器会让客户端与应用程序服务器的 IP 地址建立 直接 TCP 连接 减轻 LB的网络流量?
这取决于协议吗? (例如,HTTP 请求与 WebSocket)?或者这些协议是否要求 TCP 连接始终可用,负载均衡器在 WebSocket 连接或请求-响应 HTTP 传输的整个持续时间内接收和转发所有 IP 流量?
视情况而定。
有像 HAProxy 这样的应用层负载平衡器,其中完整的 HTTP 请求和响应通过代理传递。这里有两个独立的 TCP 连接:一个在客户端和负载均衡器之间,另一个在负载均衡器和上游服务器之间。上游服务器的选择可以根据 HTTP 请求的内容来完成,例如 Host
header and/or 路径以及 session cookie - 以确保相同的 session 总是由相同的上游服务器处理。如果上游服务器的决定是在 HTTP 请求上完成的,那么与上游服务器的连接只能在读取 HTTP 请求后建立,因为之前不知道。但请求不需要在单个数据包内。
有些网络或传输层负载平衡器根本不作用于数据包负载。相反,上游服务器的选择通常是根据客户端 IP 完成的,因此同一个客户端最终会出现在同一个上游服务器上。在这种情况下,使用哪个上游的决定已经在第一个数据包上完成(即 SYN 开始 TCP 握手)并且客户端基本上直接与上游代理建立连接 - 负载均衡器仅像路由器一样转发数据包。 HTTP 请求的大小在这里也无关紧要,因为甚至没有检查 TCP 负载来做出路由决定。
对于网络或传输层负载均衡器,可能存在非对称路由,即响应可能采用不同的方式,而不通过负载均衡器。通过应用层负载平衡,响应通过负载平衡器返回。
我想弄清楚 HTTP 流量的负载均衡器预期接收/转发/重定向。
考虑以下两种不同的 HTTP 流量场景。
- Single HTTP request 有效负载的大小明显超过 single TCP IP包(即请求需要很多网络包)
- 多个 HTTP 请求 single persistent TCP connection
他们每个人:
- 所有 网络流量(例如 TCP IP 数据包)是否会通过负载平衡器本身? (即负载均衡器“像电缆一样”看到并转发所有流量可以这么说)
- 或者负载均衡器会让客户端与应用程序服务器的 IP 地址建立 直接 TCP 连接 减轻 LB的网络流量?
这取决于协议吗? (例如,HTTP 请求与 WebSocket)?或者这些协议是否要求 TCP 连接始终可用,负载均衡器在 WebSocket 连接或请求-响应 HTTP 传输的整个持续时间内接收和转发所有 IP 流量?
视情况而定。
有像 HAProxy 这样的应用层负载平衡器,其中完整的 HTTP 请求和响应通过代理传递。这里有两个独立的 TCP 连接:一个在客户端和负载均衡器之间,另一个在负载均衡器和上游服务器之间。上游服务器的选择可以根据 HTTP 请求的内容来完成,例如 Host
header and/or 路径以及 session cookie - 以确保相同的 session 总是由相同的上游服务器处理。如果上游服务器的决定是在 HTTP 请求上完成的,那么与上游服务器的连接只能在读取 HTTP 请求后建立,因为之前不知道。但请求不需要在单个数据包内。
有些网络或传输层负载平衡器根本不作用于数据包负载。相反,上游服务器的选择通常是根据客户端 IP 完成的,因此同一个客户端最终会出现在同一个上游服务器上。在这种情况下,使用哪个上游的决定已经在第一个数据包上完成(即 SYN 开始 TCP 握手)并且客户端基本上直接与上游代理建立连接 - 负载均衡器仅像路由器一样转发数据包。 HTTP 请求的大小在这里也无关紧要,因为甚至没有检查 TCP 负载来做出路由决定。
对于网络或传输层负载均衡器,可能存在非对称路由,即响应可能采用不同的方式,而不通过负载均衡器。通过应用层负载平衡,响应通过负载平衡器返回。