13.4.1 负载均衡算法类型与适用场景

负载均衡算法类型与适用场景主要围绕流量分发的公平性、会话一致性与后端异构能力进行选择。以下结合原理示意、可执行配置与验证命令说明常见算法。

文章图片

0. 环境准备与安装验证(示例)
- 目的:确保 HAProxy 可用并能加载配置进行算法测试。
- 命令解释:-v 查看版本,-f 指定配置文件,-c 仅校验语法。

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y haproxy

# RHEL/CentOS
sudo yum install -y haproxy

# 验证安装
haproxy -v

# 校验配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg

1. 轮询(roundrobin)
- 特点:按顺序均分请求,简单、开销低。
- 适用场景:后端节点配置一致、请求处理时间接近。

# /etc/haproxy/haproxy.cfg
frontend fe_http
  bind *:8080
  default_backend be_rr

backend be_rr
  balance roundrobin
  server s1 127.0.0.1:9001 check
  server s2 127.0.0.1:9002 check
  server s3 127.0.0.1:9003 check

验证与预期效果:

# 启动 3 个后端(简单示例)
python3 -m http.server 9001 >/tmp/s1.log 2>&1 &
python3 -m http.server 9002 >/tmp/s2.log 2>&1 &
python3 -m http.server 9003 >/tmp/s3.log 2>&1 &

# 启动 HAProxy
sudo haproxy -f /etc/haproxy/haproxy.cfg

# 连续请求,预期三台依次响应
for i in {1..6}; do curl -s http://127.0.0.1:8080/ | head -n1; done

2. 加权轮询(weighted roundrobin)
- 特点:按权重分配请求,适配异构节点。

backend be_wrr
  balance roundrobin
  server s1 127.0.0.1:9001 check weight 3
  server s2 127.0.0.1:9002 check weight 2
  server s3 127.0.0.1:9003 check weight 1

命令解释:weight 3/2/1 表示流量比例约 3:2:1。
验证:连续请求 60 次,观察各后端日志数量近似比例。


3. 最少连接(leastconn)
- 特点:优先分发给当前连接数最少的节点,适合长连接。

backend be_lc
  balance leastconn
  server s1 127.0.0.1:9001 check
  server s2 127.0.0.1:9002 check
  server s3 127.0.0.1:9003 check

验证思路:使用 curl --limit-rateab 制造长连接,观察连接更少的节点被优先选中。


4. 加权最少连接(weighted leastconn)
- 特点:在最少连接基础上考虑节点权重。

backend be_wlc
  balance leastconn
  server s1 127.0.0.1:9001 check weight 3
  server s2 127.0.0.1:9002 check weight 2
  server s3 127.0.0.1:9003 check weight 1

5. 源地址哈希(source / balance source)
- 特点:根据客户端 IP 哈希固定后端,简单会话一致性。

backend be_src
  balance source
  hash-type consistent
  server s1 127.0.0.1:9001 check
  server s2 127.0.0.1:9002 check
  server s3 127.0.0.1:9003 check

说明:hash-type consistent 在节点变更时降低重分布。


6. 请求特征哈希(URI/Header/Cookie)
- 特点:基于请求特征哈希,适合缓存或分片路由。

backend be_uri_hash
  balance uri
  hash-type consistent
  server s1 127.0.0.1:9001 check
  server s2 127.0.0.1:9002 check
  server s3 127.0.0.1:9003 check

验证:对同一 URI 多次请求,应命中同一后端;不同 URI 在后端之间分布。


7. 随机(random)
- 特点:随机分配请求,配置简单。

backend be_random
  balance random
  server s1 127.0.0.1:9001 check
  server s2 127.0.0.1:9002 check
  server s3 127.0.0.1:9003 check

选型建议(简表)
- 后端同构 + 短连接:轮询/加权轮询
- 长连接 + 负载敏感:最少连接/加权最少连接
- 需要简单会话黏性:源地址哈希
- 需要特征路由或缓存一致性:URI/Header 哈希


排错与诊断(示例)
- 目的:定位算法未生效、健康检查失败、分配异常。
- 命令解释:-c 语法检查,show stat 查看实时分配与健康状态。

# 语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg

# 启用 stats socket 后查看状态
# 在 global 或 defaults 中添加:
#   stats socket /run/haproxy/admin.sock mode 660 level admin
echo "show stat" | sudo socat /run/haproxy/admin.sock stdio | head -n 5

常见问题提示:
- 后端不健康:检查 check 端口是否可达、后端服务是否启动。
- 分配不均:确认是否启用 weight、是否存在长连接影响 leastconn


练习
1. 以 roundrobinleastconn 运行同一后端组,分别使用短连接与长连接请求,记录分配差异。
2. 配置 balance sourcehash-type consistent,增加/移除一个后端,观察重分布比例。
3. 为异构后端设置权重(3:2:1),并统计 60 次请求的分配比例。