13.4.2 算法配置语法与示例
算法配置语法与示例#
本节聚焦 balance 算法配置的可执行示例、验证与排错。以下示例以 /etc/haproxy/haproxy.cfg 为主,搭配测试命令与期望现象。
原理草图(请求分发路径)#
1) 基础安装与配置检查(必须)#
# 安装(以 RHEL/CentOS 为例)
yum install -y haproxy
# 备份默认配置
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# 语法检查(无输出为通过)
haproxy -c -f /etc/haproxy/haproxy.cfg
# 启动与重载
systemctl enable --now haproxy
systemctl reload haproxy
2) 轮询(roundrobin)完整示例与验证#
# /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
daemon
maxconn 2048
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http_in
bind *:80
default_backend web_rr
backend web_rr
balance roundrobin
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 check
server web3 10.0.0.13:80 check
验证命令与期望:
# 访问多次,期望响应后端轮换
for i in {1..6}; do curl -s http://127.0.0.1/ | grep -E "web[1-3]"; done
说明:后端页面可输出自身主机名以观察轮询效果。
3) 最少连接(leastconn)示例与验证#
backend web_lc
balance leastconn
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 check
server web3 10.0.0.13:80 check
验证命令与期望:
# 并发请求下,连接数低的节点更易被选中
ab -n 200 -c 20 http://127.0.0.1/
说明:结合后端访问日志可观察分配倾向。
4) 源地址哈希(source)一致性哈希#
backend web_src
balance source
hash-type consistent
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 check
server web3 10.0.0.13:80 check
# 用不同源地址访问(示例为多出口或NAT环境下测试)
curl -s http://127.0.0.1/ -H 'X-Forwarded-For: 1.1.1.1'
curl -s http://127.0.0.1/ -H 'X-Forwarded-For: 1.1.1.2'
说明:同源地址会稳定落在同一后端。
5) URI/URL 参数/Header 哈希示例#
backend api_uri
balance uri
hash-type consistent
server api1 10.0.0.21:8080 check
server api2 10.0.0.22:8080 check
backend app_param
balance url_param user_id
hash-type consistent
server app1 10.0.0.31:8080 check
server app2 10.0.0.32:8080 check
backend app_hdr
balance hdr(X-User-ID)
hash-type consistent
server app1 10.0.0.41:8080 check
server app2 10.0.0.42:8080 check
验证命令与期望:
curl -s "http://127.0.0.1/api/item?id=1001"
curl -s "http://127.0.0.1/app?user_id=42"
curl -s -H "X-User-ID: 42" http://127.0.0.1/
说明:同一 URI/参数/Header 值应稳定命中同一后端。
6) 权重与慢启动示例#
backend web_weight
balance roundrobin
server web1 10.0.0.11:80 check weight 10 slowstart 30s
server web2 10.0.0.12:80 check weight 5 slowstart 30s
说明:weight 控制分配比例;slowstart 用于新节点渐进承载。
7) listen 段统一示例(便于小型部署)#
listen web
bind :80
mode http
balance leastconn
option httpchk GET /healthz
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 check
排错清单(常见问题与命令)#
# 1) 配置语法报错
haproxy -c -f /etc/haproxy/haproxy.cfg
# 2) 后端不可用,查看健康检查状态
journalctl -u haproxy --since "10 min ago" | tail -n 50
# 3) 端口被占用
ss -lntp | grep ':80'
# 4) 看实时会话与后端状态(需启用stats,示例略)
常见原因:后端端口不通、健康检查路径错误、mode 与实际协议不符。
练习#
1) 将 roundrobin 改为 leastconn,并用 ab 比较后端访问日志差异。
2) 为 source 算法启用一致性哈希,新增一台后端,观察请求抖动是否降低。
3) 添加 weight 与 slowstart,模拟新节点上线流量爬坡。