4.3.3 四层负载均衡小结
典型情况下,四层负载均衡器只工作在传输层 TCP/UDP connection/session 中,不论采用何种的负载均衡算法,都是力求同一 session 的字节永远落到同一后端。由于 L4LB 不感知其转发字节所属应用的任何细节,这些字节可能是 HTTP、Redis、MongoDB,或者 任何其他应用层协议,所以四层负载均衡器的应用范围非常广。
四层负载均衡的特点也是其缺点,设想如下特殊场景:
- 两个 gRPC/HTTP2 客户端通过 L4LB 建立连接到后端。
- L4LB 为每个进来(从客户端)的连接建立一个出去的(到后端)的连接,因此有两个进来的连接和两个出去的连接。
- 客户端 A 的连接每分钟发送 1 个请求,而客户端 B 的连接每秒发送 50 个请求。
由于四层负载均衡器的同一个 session 的字节永远落到同一后端,选中的处理客户端 A 请求的后端比选中的处理客户端 B 请求的后端负载要相差很多倍,这就与负载均衡的目的背道而驰。由于性能考虑(创建 TCP 连接的开销非常大,尤其连接使用 TLS 加密的时候),以及所有现代协议都在演进以支持 multiplexing(多路复用) 和 kept-alive(连接保活),因此四层负载均衡器的阻抗不匹配问题随时间越来越彰显,不过这个问题在四层负载均衡器之后再加一级七层负载均衡器就能得到解决。