3、负载均衡基础:定义、分类与核心指标

负载均衡这东西,说白了就是「把活儿分均匀」。

我刚开始接触分布式系统时,觉得负载均衡不就是加个nginx转发一下嘛。后来线上出了几次事故,才明白这玩意儿的水有多深。你想想看,一个请求从客户端进来,经过负载均衡器,最后落到某台后端服务器上——这中间任何一个环节出了问题,用户感知到的就是「系统挂了」。

所以,咱们先把基础打牢。这一节我会把负载均衡的定义、分类和核心指标讲透,顺便聊聊我在项目中踩过的坑。

3.1 负载均衡的定义

负载均衡(Load Balancing),核心目标就两个:

  • 分散压力:把请求均匀地分发到多台服务器上,避免单台机器过载。
  • 提高可用性:某台机器挂了,流量自动切到其他机器,用户无感知。

我习惯把负载均衡比作「交通指挥员」。没有它,所有车都挤一条路,早晚堵死。有了它,车流被引导到多条路上,整体通行效率大幅提升。

核心要点:负载均衡不是简单的「轮流转发」,它需要综合考虑后端服务器的健康状态、当前负载、网络延迟等因素,才能做出最优决策。

3.2 负载均衡的分类:四层 vs 七层

这是面试高频题,也是实际选型时必须搞清楚的问题。我见过不少团队,明明业务场景适合四层,非要用七层,结果性能上不去;反过来,需要七层做精细化路由,却用四层硬扛,功能实现不了。

咱们直接看对比:

维度 四层负载均衡(L4) 七层负载均衡(L7)
工作层级 传输层(TCP/UDP) 应用层(HTTP/HTTPS/gRPC)
处理内容 IP地址、端口号 URL、Header、Cookie、请求体
性能 高(内核态转发,吞吐量大) 相对低(需要解析应用层协议)
灵活性 低(只能基于IP+端口) 高(可以做内容路由、灰度发布)
典型产品 LVS、F5、HAProxy(TCP模式) Nginx、HAProxy(HTTP模式)、Envoy

3.2.1 四层负载均衡

四层负载均衡,处理的是TCP/UDP报文。它不关心请求里装的是什么,只看目标IP和端口,然后根据策略把报文转发给后端服务器。

我记得有一次,团队需要给一个MySQL读写分离做负载均衡。MySQL用的是TCP协议,业务逻辑不需要在负载层处理。我们直接上了LVS,配置简单,性能也够用。如果当时用Nginx做七层代理,反而多了一层不必要的协议解析,延迟会增加。

我的建议:如果你的场景是TCP/UDP协议,或者对性能要求极高(比如网关、数据库代理),优先考虑四层方案。它简单、高效、稳定。

3.2.2 七层负载均衡

七层负载均衡,工作在应用层。它能读懂HTTP请求里的URL、Cookie、甚至请求体内容,然后根据这些信息做精细化路由。

举个例子:

  • 根据URL路径,把 /api/v1/* 转发到微服务A,/api/v2/* 转发到微服务B。
  • 根据Header中的 X-Canary: true,把请求路由到灰度版本。
  • 根据Cookie中的 session_id,实现会话保持。

这些能力,四层负载均衡是做不到的。我参与过一个电商项目,大促期间需要做流量灰度,就是靠Nginx的七层能力,根据用户ID哈希值,把一小部分流量引到新版本上。整个过程零停机,效果很好。

注意:七层负载均衡虽然灵活,但性能开销不可忽视。解析HTTP协议、正则匹配URL、处理Cookie,这些操作都会消耗CPU。在高并发场景下,七层负载均衡本身可能成为瓶颈。我曾经遇到过Nginx CPU打满的情况,就是因为正则规则写得太复杂,每进来一个请求都要做大量匹配。

3.3 核心指标

衡量一个负载均衡方案好不好,不能光看「能不能用」。我习惯从三个维度来评估:吞吐量、延迟、一致性。这三个指标,基本决定了系统的性能和可靠性。

3.3.1 吞吐量(Throughput)

吞吐量,指的是单位时间内系统能处理的请求数量。常用单位是QPS(每秒查询数)或TPS(每秒事务数)。

负载均衡器的吞吐量,决定了它能扛住多大的流量。举个例子:

  • 单机Nginx,在普通硬件上,七层代理的吞吐量大概在几万QPS。
  • LVS(四层),同样硬件,吞吐量可以到几十万甚至上百万QPS。

为什么会差这么多?因为Nginx需要做HTTP协议解析,而LVS在内核态直接转发报文,几乎没有额外开销。

实战经验:我在压测一个网关服务时,发现吞吐量上不去。排查了半天,最后发现是负载均衡器的CPU先打满了。换了个更高效的方案后,吞吐量直接翻了三倍。所以,选型时一定要考虑吞吐量上限,留足余量。

3.3.2 延迟(Latency)

延迟,指的是一个请求从发出到收到响应所花费的时间。负载均衡器本身会引入一定的延迟,这个延迟越小越好。

延迟通常分为两部分:

  • 网络延迟:数据包在网络上传输的时间。
  • 处理延迟:负载均衡器处理请求的时间(包括协议解析、路由决策、连接管理等)。

我习惯用P99(99%的请求延迟)来衡量系统性能。为什么不用平均值?因为平均值容易被少数慢请求拉低,而P99能真实反映大多数用户的体验。

避坑指南:我曾经在项目中遇到一个问题——负载均衡器配置了健康检查,但健康检查的频率太高,导致后端服务器频繁被标记为「不健康」,流量不断切换,反而增加了延迟。后来我把健康检查间隔从1秒调整到5秒,问题就解决了。有时候,过度「积极」反而会坏事。

3.3.3 一致性(Consistency)

一致性,在负载均衡的语境下,通常指的是「会话保持」或「哈希一致性」。简单说,就是同一个用户的请求,能不能始终落到同一台后端服务器上。

为什么需要一致性?因为很多应用是有状态的。比如:

  • 用户登录后,session信息存在服务器A的内存里。
  • 下一个请求被转发到服务器B,服务器B没有这个session,用户就得重新登录。

解决这个问题,常见的方法有:

  • 源地址哈希:根据客户端IP做哈希,同一个IP的请求始终发到同一台服务器。
  • Cookie插入:负载均衡器在响应中插入一个Cookie,后续请求根据Cookie值路由。
  • 一致性哈希:在分布式缓存场景中,用一致性哈希算法减少节点增减时的缓存失效。

注意:一致性不是万能的。如果后端服务器宕机,一致性策略会导致该服务器上的所有用户都受影响。所以,实际项目中,我通常会把「一致性」和「高可用」结合起来——优先保证一致性,但服务器挂了就自动切到其他机器,牺牲一致性保可用性。

3.4 知识体系总览

为了让你更直观地理解这一节的内容,我画了一张图,把负载均衡的基础知识串起来。

负载均衡基础知识体系 负载均衡 定义 分类 核心指标 分散压力 提高可用性 四层 L4 七层 L7 吞吐量 延迟 一致性 核心要点 • 四层负载均衡:高性能,适合TCP/UDP协议,典型产品LVS、F5 • 七层负载均衡:灵活,适合HTTP/HTTPS,典型产品Nginx、Envoy • 核心指标:吞吐量(QPS)、延迟(P99)、一致性(会话保持)

3.5 小结

这一节的内容,说白了就是三件事:

  • 负载均衡是什么:把请求分散到多台服务器,提高系统的吞吐量和可用性。
  • 四层和七层怎么选:性能优先选四层,灵活优先选七层。没有的好坏,只有合不合适的场景。
  • 三个核心指标:吞吐量、延迟、一致性。做方案时,这三个指标必须量化,不能凭感觉。