HAProxy 1.8配置问题:如何避免客户端粘滞到备份服务器
解决HAProxy 1.8中客户端粘滞到备份服务器的问题
你遇到的这个问题确实很棘手——备份服务器本应只是临时兜底的角色,结果因为stick-table的关联记录,导致常规服务器恢复后客户端还一直走备份,完全违背了备份的设计初衷。好在HAProxy的stick指令支持条件判断,我们可以通过配置来避免备份服务器的关联被记录到stick-table中。
核心思路
我们需要让stick-table只记录客户端与常规服务器的关联,当客户端被临时转发到备份服务器时,不将这个关联存入stick-table。这样当常规服务器恢复后,客户端的请求会重新参与负载均衡,分配到正常服务器并建立新的粘滞关联。
修改后的配置示例
defaults option redispatch frontend fe_test bind 127.0.0.1:8081 stick-table type ip size 1m expire 1h acl acl_test hdr(host) -i whatever.domain.com # ... 其他前端配置 use_backend be_test if acl_test # ... 其他后端路由 backend be_test mode http balance roundrobin # 定义ACL匹配当前请求是否被转发到备份服务器 acl is_backup_server server backup # 仅当请求未被转发到备份服务器时,才将客户端与服务器的关联存入stick-table stick on hdr(X-Real-IP) table fe_test stick store-response hdr(X-Real-IP) table fe_test unless is_backup_server option httpchk GET /check server test-01 server-01.lan:8080 check server test-02 server-02.lan:8080 check server maintenance 127.0.0.1:8085 backup
配置解释
acl is_backup_server server backup:这条ACL用来判断当前请求最终被转发到的服务器是否是备份服务器(通过server backup条件匹配所有标记为backup的服务器)。stick store-response ... unless is_backup_server:stick store-response负责将客户端IP与当前服务器的关联写入stick-table,这里通过unless is_backup_server条件,确保只有当请求被转发到常规服务器时才执行写入操作。当客户端被转到备份服务器时,不会留下任何关联记录。stick on hdr(X-Real-IP) table fe_test:这条指令负责在请求进来时匹配stick-table中已有的关联,确保常规服务器正常时,客户端能粘滞到之前的服务器。
额外验证点
- 确保
X-Real-IP头能正确获取客户端真实IP(如果是直接访问HAProxy,也可以用src替代hdr(X-Real-IP),更可靠)。 - 测试时可以手动停掉所有常规服务器,让客户端转到备份,然后恢复常规服务器,观察客户端是否自动切换回常规服务器。
备选方案(如果上述配置不生效)
如果因为HAProxy版本细节导致server backup ACL不生效,你也可以通过服务器名称来匹配备份服务器:
backend be_test # ... 其他配置 acl is_backup_server server_name maintenance stick store-response hdr(X-Real-IP) table fe_test unless is_backup_server # ... 服务器配置
这里通过server_name maintenance直接匹配备份服务器的名称,同样能达到排除备份服务器记录的效果。
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

