HAProxy如何基于客户端IP自定义哈希实现动态后端选择
HAProxy 基于客户端IP哈希选后端集群配置方案
你要实现的「客户端IP哈希取模选集群、集群内最小连接负载」的逻辑不需要自定义开发,直接用HAProxy内置的样本抓取、转换器和ACL规则即可实现,以下是可直接使用的配置:
frontend myserver bind *:80 # 四层TCP代理场景请把下一行的http-request替换为tcp-request content http-request set-var(txn.ip_hash_mod) src,hash32(0),mod(2) use_backend backend0 if { var(txn.ip_hash_mod) -m int 0 } default_backend backend1 backend backend0 balance leastconn server server-1 <ip>:port check server server-2 <ip>:port check backend backend1 balance leastconn server server-3 <ip>:port check server server-4 <ip>:port check
配置逻辑说明
src:HAProxy内置抓取方法,直接获取客户端源IP,对应伪代码中的clientIP参数hash32(0):内置哈希转换器,对输入值做32位哈希计算,括号内的0是哈希种子,可自行修改为其他整数调整哈希分布结果;如果需要更换哈希算法,可直接替换为crc32、hash32-sdbm等其他内置哈希转换器,用法一致mod(2):对前一步输出的哈希值做取模2运算,最终输出0或1两个结果,对应两个后端集群- 计算结果存在事务变量
txn.ip_hash_mod中,方便后续加日志调试、扩展其他匹配规则,比直接把运算逻辑写在ACL中更易维护
扩展说明
- 如果后续需要扩容到N个后端集群,只需要把
mod(2)改为mod(N),补充对应use_backend规则匹配0到N-1的运算结果即可 - 集群内部保留
balance leastconn配置,同一哈希结果的客户端请求会在集群内的多台服务器间按最小连接数分发,不会出现单客户端固定调度到单台服务器的问题 - 验证哈希分布效果时,可以在frontend的日志格式中加入
%[var(txn.ip_hash_mod)]字段,统计线上请求的取模结果占比,正常情况下会接近1:1均匀分布
内容的提问来源于stack exchange,提问作者ari
相关产品推荐
相关产品推荐

