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) 添加 weightslowstart,模拟新节点上线流量爬坡。