据我所知,L4负载均衡器维护2个TCP连接:
- 一个是从前端到负载均衡器
- LB 终止上述连接,创建新的 TCP 连接,并修改 TCP 数据包的 IP/端口以转发至后端。
在 HTTP2/gGPRC 中,客户端-服务器将维护一个长连接。如果我们使用 L4,则此连接将是上面提到的第一个连接。
在一些文章中,我读到,虽然部署了多个后端服务器,但是一旦一个客户端向一个后端发出第一个请求,该客户端-后端对将保留用于所有后续请求。这意味着其他后端未被使用。
以下是其中一篇文章: https://blog.bugsnag.com/envoy/
gRPC 使用性能增强的 HTTP/2 协议。HTTP/2 实现比其前身更低延迟的众多方法之一是利用单个长寿命 TCP 连接并在其上多路复用请求/响应。这给第 4 层 (L4) 负载均衡器带来了问题,因为它们的运行级别太低,无法根据收到的流量类型做出路由决策。因此,尝试对 HTTP/2 流量进行负载平衡的 L4 负载均衡器将打开单个 TCP 连接并将所有后续流量路由到同一个长寿命连接,从而实际上抵消了负载平衡。
我真的不太清楚这一点。有人能解释一下吗?非常感谢!谢谢
答案1
如果您的客户端比后端服务器多,这可能不是问题。尝试使用最少连接算法,例如 haproxy 的“leastconn”。举个例子,也许您的 10 个交换机通过 gRPC 将指标数据传输到监控平台的 3 个后端节点。每个后端都会有一些工作。
即使您只有一个连接,这可能也不是问题,假设单个节点可以处理它。实际上,这变成了主动/被动配置。该主机保持空闲是否值得花费由您决定。
话虽如此,有时负载均衡器会在第 7 层检查应用程序。一个常见的 HTTP 示例是 Cookie 亲和性。但是,长寿命连接不需要第 7 层。
答案2
我认为您对第 4 层(想想 LVS 和路由)和第 7 层(HAProxy)有点困惑。TCP 模式下的 HAProxy 类似于第 4 层负载均衡器,但它确实会创建两个连接。正确的第 4 层负载均衡器只会路由数据包(没有新连接)。
您可以使用任一模式对于 HTTP2 直通,它将工作得很好。但是 HAProxy 显然会失去源 IP 透明度,因为它是代理而不是路由器。
HAProxy 现在也在前端支持 HTTP2,但在 Loadbalancer.org 这里我们倾向于建议大多数时间坚持使用 L4 直通,因为它快速且可靠。