易君召
发布于 2026-08-06 / 作者:易君召 / 2 阅读
0

负载均衡在分布式系统中的实现

负载均衡核心目标:把流量 / 请求分发到多个服务实例,避免单点过载,提升吞吐量、可用性、容错能力,贯穿请求入口、服务调用、数据存储全链路。按实现层级分为:四层负载、七层负载、服务发现内置负载均衡、数据库负载均衡,同时包含算法、容错、一致性相关机制。

一、四层负载均衡(传输层 L4)

工作在 TCP/UDP 层,基于 IP + 端口做转发,不解析应用层协议,转发速度极高。

典型实现

  1. LVS(Linux Virtual Server)

    • 内核态实现,性能极强,百万级并发;三种模式:NAT、DR(直接路由,最常用)、TUN 隧道。

    • DR 模式:请求经过 LVS,响应直接后端服务器返回客户端,不回包经过 LB,性能最优。

  2. 硬件 F5、A10:专用硬件负载均衡设备,高性能高可靠,成本高。

特点:只看 IP 端口,无法识别 HTTP URL、Header、Cookie;适合 TCP 长连接、数据库、RPC 流量。

二、七层负载均衡(应用层 L7)

解析 HTTP/HTTPS/RPC 协议,可以基于 URL、Header、Cookie、权重做更智能的分发。

典型实现

  1. Nginx / Nginx‑Plus

    nginx upstream模块实现七层负载均衡,可做反向代理、SSL 卸载、限流、缓存。

nginx

upstream backend {
    server 192.168.1.101:8080 weight=2;
    server 192.168.1.102:8080 weight=1;
}
server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}
  1. HAProxy:同时支持 L4+L7,性能优秀,支持健康检查、会话保持,大量用于 Web、MySQL 代理。

  2. 云厂商 SLB/ALB:阿里云 ALB、AWS ALB,托管式七层负载均衡。

特点:可以按业务逻辑路由;CPU 消耗高于四层,需要解析协议报文。

三、客户端侧负载均衡(服务发现模式,微服务主流)

无中心代理,客户端本地做负载均衡,SpringCloud、Dubbo、gRPC 都是这套模式。

流程:

  1. 服务实例启动注册到注册中心(Nacos/Eureka/Consul);

  2. 客户端从注册中心拉取服务实例列表,缓存本地;

  3. 客户端本地执行负载均衡算法,直接调用目标实例,流量不经过中央代理。

组件举例

  • Dubbo:内置负载均衡(随机、轮询、一致性 hash、最小活跃数)

  • Spring Cloud LoadBalancer:SpringCloud 官方客户端 LB

  • gRPC:客户端负载均衡 + NameResolver 服务发现

优点:无代理瓶颈;缺点:每个客户端都要集成 LB 逻辑,实例列表缓存要处理变更。

四、服务端代理模式(Sidecar 边车代理,ServiceMesh)

代表:Istio + Envoy

Sidecar(Envoy)部署在每个业务 Pod 旁边,所有进出流量经过 Sidecar,由 Sidecar 完成负载均衡、熔断、限流、重试。

  • 业务代码完全不需要感知负载均衡逻辑,能力下沉到 Sidecar;

  • 支持高级策略:按版本灰度、流量镜像、熔断、超时控制;

  • 代价:增加一层代理,带来少量性能开销。

五、负载均衡常用分发算法

算法

说明

适用场景

轮询 (Round‑Robin)

依次轮流分发

实例性能均等,无状态服务

加权轮询

按权重分配流量,性能高实例权重高

机器配置不一致场景

随机 (Random)

随机选后端实例

简单场景,实例数量足够时效果接近轮询

加权随机

带权重随机

机器性能差异

最小连接数

选择当前活跃连接最少实例

请求处理时长差异大,长连接场景

最小活跃数 (Dubbo)

处理中请求最少节点

RPC 调用,慢请求场景

一致性 Hash

相同 key 永远路由到同一个实例

会话黏连、缓存,避免缓存雪崩

会话保持:比如基于 Cookie,同一个用户始终打向同一个实例;分布式系统尽量少依赖会话保持,优先无状态设计

六、关键配套机制(负载均衡必须配合)

1. 健康检查

剔除故障节点,不把请求转发给挂掉实例

  • 四层:TCP 握手探测

  • 七层:HTTP GET/POST 健康接口

  • 注册中心:心跳上报,实例不健康就从列表摘除

2. 故障转移 & 重试

  • 实例调用失败,负载均衡自动选择其他节点重试;

  • 注意幂等,非幂等接口不能随便重试,防止重复创建订单。

3. 会话黏连 vs 无状态

会话黏连会破坏负载均衡效果,最优实践:服务无状态,会话放 Redis 等外部存储

4. 限流、熔断、降级

负载均衡只管分发,无法防止雪崩,要配合熔断:某个实例大量报错,就暂时隔离该节点。

七、存储层负载均衡

不止 Web/RPC,数据库、缓存同样需要负载均衡:

  1. MySQL:ProxySQL、MaxScale,读写分离,读请求负载均衡到多个从库。

  2. Redis 集群:Redis Cluster 哈希槽分片,客户端 / 代理做分片负载均衡;Twemproxy。

  3. 对象存储:多副本,请求分散到多节点。

八、分层架构组合(生产常见完整链路)

用户请求四层 SLB (LVS)七层 Nginx/ALB → 微服务(客户端 LB / Istio Envoy) → 数据库代理 → 存储

  • LVS 扛大流量,做接入层;

  • Nginx 做 SSL 卸载、路由、限流;

  • 微服务层做服务发现、灰度、熔断;

  • 存储代理做读写分离。

九、几种方案对比

方案

部署位置

性能

运维成本

典型场景

LVS(L4)

接入层,服务器

极高

中等

大流量接入层

Nginx/HAProxy(L7)

接入层代理

Web 网关

客户端负载均衡

业务代码内

业务侵入

Dubbo/SpringCloud 微服务

Sidecar(Istio Envoy)

每个实例边车

中高

ServiceMesh 云原生微服务

十、容易踩坑

  1. 只做负载均衡,没有健康检查,故障节点继续接收流量;

  2. 过度使用会话黏连,流量分布严重不均衡;

  3. 重试没有限制,故障时造成请求风暴;

  4. 四层 LB 下源 IP 丢失,后端拿不到真实客户端 IP,需要开启X‑Forwarded‑For

  5. 一致性 hash 虚拟节点配置不合理,扩容缩容大量缓存失效。


本文原创作者易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/load-balancing-distributed-systems-implementation-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/