Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

负载均衡算法

| , 1 minutes reading.

负载均衡算法

引言:“单点故障”问题

想象一家餐厅有 100 個客人,但只有 1 名服务员。服务员会被累死,而客人会等得发疯。如果你雇了 5 名服务员,你就需要一种方法来决定哪位服务员服务哪张桌子。

负载均衡 (Load Balancing) 是将进入的网络流量分发到一组后端服务器(服务器池)的过程。它确保没有一台服务器承受过大的压力,从而提高响应速度和可用性。

算法要解决什么问题?

  • 输入: 涌入的请求流。
  • 输出: 处理该请求的最佳后端服务器。
  • 承诺: 可扩展性(通过增加服务器来处理更多流量)和可靠性(如果一台服务器挂了,其他服务器能接管流量)。

常见算法

1. 轮询 (Round Robin)

  • 逻辑: 简单地按顺序分配:服务器 1,然后是 2,然后是 3,再回到 1。
  • 适用场景: 所有服务器硬件配置相同,且每个请求的处理成本大致相等。

2. 加权轮询 (Weighted Round Robin)

  • 逻辑: 根据服务器的处理能力分配“权重”。权重为 10 的服务器收到的请求是权重为 5 的服务器的两倍。
  • 适用场景: 服务器集群配置不均(例如,有些机器是 64GB 内存,有些只有 16GB)。

3. 最小连接数 (Least Connections)

  • 逻辑: 将下一个请求发送到当前活跃连接数最少的服务器。
  • 适用场景: 处理耗时差异很大的请求(如视频流或持久的 WebSocket 连接)。

4. IP 哈希 (IP Hash)

  • 逻辑: 根据客户端的 IP 地址决定去哪台服务器(例如 hash(客户端IP) % N)。
  • 适用场景: “粘性会话 (Sticky Sessions)”。确保同一个用户始终访问同一台服务器,以利用本地缓存或 Session 数据。

典型业务场景

  • ✅ Web 服务器: Nginx 或 HAProxy 将 HTTP 请求分发到 Node.js/Python 后端。

  • ✅ 数据库读副本: 将 “SELECT” 查询分散到 5 个只读数据库节点上。

  • ✅ API 网关: 根据路由路径将流量引导到不同的微服务。

  • ❌ 有状态应用: 如果你使用轮询,就不能在服务器内存里存用户 Session。你必须使用共享的 Redis 存储,或者使用 IP 哈希

性能与复杂度总结

  • 效率: 极高。大多数算法的复杂度为 O(1)O(1)O(logN)O(\log N)
  • 开销: 与水平扩展带来的收益相比,算法本身的开销几乎可以忽略不计。

小结:一句话记住它

“负载均衡是互联网的‘交通警察’。它确保你的系统可以通过增加‘人手’来扩容,并让你在单台服务器宕机时依然屹立不倒。”