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-rate 或 ab 制造长连接,观察连接更少的节点被优先选中。
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. 以 roundrobin 与 leastconn 运行同一后端组,分别使用短连接与长连接请求,记录分配差异。
2. 配置 balance source 与 hash-type consistent,增加/移除一个后端,观察重分布比例。
3. 为异构后端设置权重(3:2:1),并统计 60 次请求的分配比例。