4.1 负载均衡与代理 业内讨论网络负载均衡时,“负载均衡器”(Load Balancer)和“代理”(Proxy)这两个术语常被互换使用。本文延续这一惯例,将二者视为大体等同的概念。 严格来讲,不是所有代理都是负载均衡器, 但绝大部分代理的核心功能都包括负载均衡。 图 4-1 展示了负载均衡的高层架构,客户端(Client)通过负载均衡器(Load Balancer)访问后端服务器(backend)。从整体架构来看,中间的负载均衡器承担以下职责: 服务发现:识别系统中可用的后端服务器,并获取它们的地址,以便负载均衡器与后端通信。 健康检查:确定哪些后端服务器处于健康状态并能够接收请求。 负载均衡:基于适当的算法将请求均匀分配到健康的后端服务器上。
业内讨论网络负载均衡时,“负载均衡器”(Load Balancer)和“代理”(Proxy)这两个术语常被互换使用。本文延续这一惯例,将二者视为大体等同的概念。
:::tip 注意
严格来讲,不是所有代理都是负载均衡器, 但绝大部分代理的核心功能都包括负载均衡。
:::
图 4-1 展示了负载均衡的高层架构,客户端(Client)通过负载均衡器(Load Balancer)访问后端服务器(backend)。从整体架构来看,中间的负载均衡器承担以下职责:
:::center
图 4-1 负载均衡高层架构图
:::
合理使用负载均衡能为分布式系统带来诸多好处:
笔者无法一一详述各类负载均衡系统的原理与区别。但从处理请求的网络层次角度看,所有的负载均衡系统可归纳为两大类:四层负载均衡和七层负载均衡,分别对应 OSI 模型的传输层和应用层。
需要注意,所谓的“四层负载均衡”并不局限于 OSI 模型的第四层(传输层)。
实际上,四层负载均衡器的工作模式涉及多个网络层次:
四层负载均衡的共同特点在于维持传输层协议(如 TCP、UDP)的连接特性。如果读者在其他资料中遇到“二层负载均衡”或“三层负载均衡”的说法,应理解为这是指负载均衡器在不同网络层次上的工作方式。
图 4-2 展示了四层负载均衡器的工作模型:客户端建立一个 TCP 连接,负载均衡器选择合适的后端服务器,并将客户端的 TCP 连接转发给该后端。
:::center
图 4-2 四层负载均衡器“转发”客户端的 TCP 连接
:::
典型情况下,四层负载均衡器处理的是 TCP、UDP 等连接协议,不关心传输字节所属应用的具体细节,这些字节可能来自 Web 应用、数据库服务或其他网络服务。因此,四层负载均衡器具有广泛的应用范围。
由于建立连接的开销较大(如 TCP 三次握手,特别是在启用 TLS 加密时),许多网络协议(如 TCP、HTTP/2、QUIC 和 WebSockets)在演进过程中逐步支持“多路复用”(multiplexing)和“连接保持”(connection keep-alive)等特性,以减少连接开销。为了实现“持久连接”,四层负载均衡器会确保同一连接或会话的流量始终转发至相同的后端服务器。
仔细思考,“持久连接”机制存在一个问题,以下是一个示例场景:
:::center
图 4-3 四层负载均衡器下的“连接保持”现象
:::
四层负载均衡器基于哈希算法(如 IP 源地址哈希)将 Client A 的 TCP 会话内所有请求集中到某台服务器上,导致这台服务器过载,而其他服务器则处于闲置状态。这种资源利用不均的问题在电气工程和信号传输领域称为“阻抗不匹配”现象。
随着用户规模扩大,四层负载均衡器面临的“阻抗不匹配”问题将变得更加明显。
不过也不要担心,计算机领域内有一句流传颇广的俚语:
计算机科学中的所有问题都可以通过增加一个间接层来解决。如果不够,那就再加一层。
:::
添加一个七层负载均衡器作为四层负载均衡器的二级分发器可有效缓解这一问题:
七层负载均衡器工作在应用层,意味着它只能通过建立新的传输层连接来将请求代理至后端服务器。
七层负载均衡的代理模式如图 4-4 所示。客户端与七层负载均衡器建立了一个 HTTP/2 连接,七层负载均衡器则分别与两个业务后端建立连接。当客户端发送 HTTP 请求(stream)时:
:::center
图 4-4 七层负载均衡器新建 TCP 连接至后端服务器
:::
七层负载均衡器工作在应用层,具备检测和处理应用层内容的能力。应用层内容包括:
因此,与仅基于 IP 和端口进行简单流量分发的四层负载均衡器相比,七层负载均衡器能够处理更复杂的功能,如根据 URL、请求方法、Cookie 等应用层信息做出更精细的路由决策,并支持内容缓存、压缩、TLS/SSL 卸载等高级功能。