4.1 负载均衡与代理

业内讨论网络负载均衡时,“负载均衡器”(Load Balancer)和“代理”(Proxy)这两个术语常被互换使用。本文延续这一惯例,将二者视为大体等同的概念。

注意

严格来讲,不是所有代理都是负载均衡器, 但绝大部分代理的核心功能都包括负载均衡。

图 4-1 展示了负载均衡的高层架构,客户端(Client)通过负载均衡器(Load Balancer)访问后端服务器(backend)。从整体架构来看,中间的负载均衡器承担以下职责:

  • 服务发现:识别系统中可用的后端服务器,并获取它们的地址,以便负载均衡器与后端通信。
  • 健康检查:确定哪些后端服务器处于健康状态并能够接收请求。
  • 负载均衡:基于适当的算法将请求均匀分配到健康的后端服务器上。


图 4-1 负载均衡高层架构图

合理使用负载均衡能为分布式系统带来诸多好处:

  • 命名抽象:客户端通过预设机制(如 DNS 或内置库)访问负载均衡器,而无需了解后端服务器的拓扑结构或配置。
  • 容错:通过健康检查和多种负载均衡算法,将请求均匀转发至正常的后端服务器,故障服务器则会被移出负载均衡池,便于运维人员从容修复。
  • 成本和性能收益:分布式系统通常是异构的,后端服务器分布在多个网络区域(Zone/Region)。负载均衡器通过策略优先将请求保持在同一网络区域内,从而提高服务性能(减少延迟)并降低资源成本(减少跨区域带宽费用)。

笔者无法一一详述各类负载均衡系统的原理与区别。但从处理请求的网络层次角度看,所有的负载均衡系统可归纳为两大类:四层负载均衡和七层负载均衡,分别对应 OSI 模型的传输层和应用层。

4.1.1 四层负载均衡

需要注意,所谓的“四层负载均衡”并不局限于 OSI 模型的第四层(传输层)。

实际上,四层负载均衡器的工作模式涉及多个网络层次:

  • 在第二层(数据链路层),通过修改 MAC 地址进行请求转发;
  • 在第三层(网络层),通过修改 IP 地址实现请求转发;
  • 在第四层(传输层),通过修改 UDP 或 TCP 的端口和连接地址,以网络地址转换(NAT)的方式实现请求转发。

四层负载均衡的共同特点在于维持传输层协议(如 TCP、UDP)的连接特性。如果读者在其他资料中遇到“二层负载均衡”或“三层负载均衡”的说法,应理解为这是指负载均衡器在不同网络层次上的工作方式。

图 4-2 展示了四层负载均衡器的工作模型:客户端建立一个 TCP 连接,负载均衡器选择合适的后端服务器,并将客户端的 TCP 连接转发给该后端。


图 4-2 四层负载均衡器“转发”客户端的 TCP 连接

典型情况下,四层负载均衡器处理的是 TCP、UDP 等连接协议,不关心传输字节所属应用的具体细节,这些字节可能来自 Web 应用、数据库服务或其他网络服务。因此,四层负载均衡器具有广泛的应用范围。

由于建立连接的开销较大(如 TCP 三次握手,特别是在启用 TLS 加密时),许多网络协议(如 TCP、HTTP/2、QUIC 和 WebSockets)在演进过程中逐步支持“多路复用”(multiplexing)和“连接保持”(connection keep-alive)等特性,以减少连接开销。为了实现“持久连接”,四层负载均衡器会确保同一连接或会话的流量始终转发至相同的后端服务器。

仔细思考,“持久连接”机制存在一个问题,以下是一个示例场景:

  • Client A 和 Client B 两个 HTTP/2 客户端通过四层负载均衡器和后端服务器建立持久连接。
  • Client A 的 TCP 连接每分钟发送 40 个 HTTP 请求,而 Client B 的 TCP 连接每秒发送 1 个 HTTP 请求。


图 4-3 四层负载均衡器下的“连接保持”现象

四层负载均衡器基于哈希算法(如 IP 源地址哈希)将 Client A 的 TCP 会话内所有请求集中到某台服务器上,导致这台服务器过载,而其他服务器则处于闲置状态。这种资源利用不均的问题在电气工程和信号传输领域称为“阻抗不匹配”现象。

随着用户规模扩大,四层负载均衡器面临的“阻抗不匹配”问题将变得更加明显。

不过也不要担心,计算机领域内有一句流传颇广的俚语:

计算机科学中的所有问题都可以通过增加一个间接层来解决。如果不够,那就再加一层。

添加一个七层负载均衡器作为四层负载均衡器的二级分发器可有效缓解这一问题:

  • 四层负载均衡器在传输层进行初步的请求转发;
  • 七层负载均衡器在应用层进一步细化请求转发。

4.1.2 七层负载均衡

七层负载均衡器工作在应用层,意味着它只能通过建立新的传输层连接来将请求代理至后端服务器。

七层负载均衡的代理模式如图 4-4 所示。客户端与七层负载均衡器建立了一个 HTTP/2 连接,七层负载均衡器则分别与两个业务后端建立连接。当客户端发送 HTTP 请求(stream)时:

  • 请求 1(stream1)被代理至第一个后端服务器;
  • 请求 2(stream2)被代理至第二个后端服务器。


图 4-4 七层负载均衡器新建 TCP 连接至后端服务器

七层负载均衡器工作在应用层,具备检测和处理应用层内容的能力。应用层内容包括:

  • 可选的 TLS(传输层安全性):尽管 TLS 的归属层次在网络领域尚有争议,为了讨论的便利,本文假设其属于七层。
  • 物理 HTTP 协议:包括 HTTP/1、HTTP/2、HTTP/3。
  • 逻辑 HTTP 协议:涉及请求的头部、主体和尾部数据。
  • 消息协议:如 gRPC、RESTful API、SOAP、AMQP、MQTT 等。

因此,与仅基于 IP 和端口进行简单流量分发的四层负载均衡器相比,七层负载均衡器能够处理更复杂的功能,如根据 URL、请求方法、Cookie 等应用层信息做出更精细的路由决策,并支持内容缓存、压缩、TLS/SSL 卸载等高级功能。

总字数:1798
Last Updated:
Contributors: isno