【Haproxy】Haproxy的算法详解及配置

发布时间:2026/6/26 9:07:15

【Haproxy】Haproxy的算法详解及配置 前情提要本篇博客详细介绍了haproxy使用的调度算法包括静态的static-rr、first动态的roundrobin、leastconn还有可静可动的source、uri、url_param、hdr通过本篇博客你可以理解和掌握这些算法的工作原理还有配置方法HAProxy通过固定参数 balance 指明对后端服务器的调度算法balance参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法有些算法可以根据参数在静态和动态算法中相互转换。一、静态算法静态算法按照事先定义好的规则轮询公平调度不关心后端服务器的当前负载、连接数和响应速度等且无法实时修改权重(只能为0和1,不支持其它值)只能靠重启HAProxy生效。1.1 static-rr基于权重的轮询调度不支持运行时利用socat进行权重的动态调整(只支持0和1,0代表下线1代表上线不支持其它值)不支持端服务器慢启动其后端主机数量没有限制相当于LVS中的 wrr慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它而是先给一部分当没问题后在给一部分配置示例[rootHA ~]# vim /etc/haproxy/haproxy.cfg listen webserver-cluster-80 bind 172.25.254.100:80 balance static-rr mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 2 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1客户端访问测试[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.201.2 first根据服务器在列表中的位置自上而下进行调度其只会当第一台服务器的连接数达到上限新请求才会分配给下一台服务其会忽略服务器的权重设置不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance first mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1客户端访问测试[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10二、动态算法基于后端服务器状态进行调度适当调整新请求将优先调度至当前负载较低的服务器权重可以在haproxy运行时动态调整无需重启2.1 roundrobinhaproxy的默认算法基于权重的轮询动态调度算法支持权重的运行时调整不同于lvs中的rr轮训模式HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)其每个后端backend中最多支持4095个real server支持对real server权重动态调整roundrobin为默认调度算法,此算法使用广泛配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance roundrobin mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 2 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1客户端访问测试[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 webserver1-192.168.0.10 Webserver2-192.168.0.20动态修改权重# 修改权重为1 [rootHA ~]# echo set weight webserver-cluster-80/webserver1 1 | socat stdio /var/lib/haproxy/haproxy.sock1 [rootHA ~]# echo get weight webserver-cluster-80/webserver1 | socat stdio /var/lib/haproxy/haproxy.sock1 1 (initial 2)客户端访问测试[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 Webserver2-192.168.0.20 webserver1-192.168.0.10 Webserver2-192.168.0.202.2 leastconnleastconn加权的最少连接的动态支持权重的运行时调整和慢启动即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接)比较适合长连接的场景使用比如MySQL等场景。配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance leastconn mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1三、其他算法其它算法即可作为静态算法又可以通过选项成为动态算法3.1 source源地址hash基于用户源地址hash并将请求转发到后端服务器后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时会导致很多用户的请求转发至新的后端服 务器默认为静态方式但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP 模式下使用也可给拒绝会话cookie的客户提供最好的会话粘性适用于session会话保持但不支持 cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式分别是取模法和一致性hash配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance source mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1客户端访问测试# 访问客户端IP172.25.254.99 [rootclient ~]# for i in {1..10};do curl 172.25.254.100;done Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 Webserver2-192.168.0.20 # 访问客户端IP172.25.254.190 [rootclient ~]# for i in {1..10};do curl 172.25.254.100;done webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.10 webserver1-192.168.0.103.1.1 map-base映射哈希 取模法map-based取模法对source地址进行hash计算再基于服务器总权重的取模最终结果决定将此请 求转发至对应的后端服务器。此方法是静态的即不支持在线调整权重不支持慢启动可实现对后端服务器均衡调度缺点是当服务器的总权重发生变化时即有服务器上线或下线都会因总权重发生变化而导致调度结果 整体改变hash-type 指定的默值为此算法计算过程所谓取模运算就是计算两个数相除之后的余数10%73, 7%43map-based算法基于权重取模hash(source_ip)%所有后端服务器相加的总权重比如当源hash值时111111121113三台服务器a b c的权重均为1 即abc的调度标签分别会被设定为 0 1 21111%311112%321113%30 1111 ----- nodeb 1112 ------ nodec 1113 ------ nodea 如果a下线后权重数量发生变化 1111%211112%201113%21 1112和1113被调度到的主机都发生变化这样会导致会话丢失配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance source hash-type map-based mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1 # 不支持动态调整权重值 # 只能动态上线和下线3.1.2 一致性hashconsistent一致性哈希当服务器的总权重发生变化时对调度结果影响是局部的不会引起大的变动hasho mod n该hash算法是动态的支持使用 socat等工具进行在线权重调整支持慢启动算法1、后端服务器哈希环点keyAhash(后端服务器虚拟ip)%(2^32) 2、客户机哈希环点key1hash(client_ip)%(2^32) 得到的值在[0---4294967295]之间 3、将keyA和key1都放在hash环上将用户请求调度到离key1最近的keyA对应的后端服务器hash环偏斜问题增加虚拟服务器IP数量比如一个后端服务器根据权重为1生成1000个虚拟IP再hash。而后端服务器权重为2则生成2000的虚拟IP再hash,最终在hash环上生成3000个节点从而解决hash环偏斜问题hash对象Hash对象到后端服务器的映射关系一致性hash示意图后端服务器在线与离线的调度方式配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance source hash-type consistent mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 13.2 uri基于对用户请求的URI的左半部分或整个uri做hash再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器适用于后端是缓存服务器场景默认是静态算法也可以通过hash-type指定map-based和consistent来定义使用取模法还是一致性hash根据用户请求的 URI 进行哈希计算确保相同 URI 的请求被发送到同一台后端服务器注意此算法基于应用层所以只支持mode http不支持mode tcpscheme://user:passwordhost:port/path;params?query#frag 左半部分/path;params 整个uri/path;params?query#frag3.2.1 uri取模法配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance uri mode http server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 13.2.2 uri一致性hash配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance uri mode http hash-type consistent # 关键参数 server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 13.2.3 客户端访问测试访问不同的uri确认可以将用户同样的请求转发至相同的服务器# 准备测试用例 [rootWebserver2 ~]# echo 192.168.0.20-index1 /var/www/html/index1.html [rootWebserver2 ~]# echo 192.168.0.20-index2 /var/www/html/index2.html [rootWebserver2 ~]# echo 192.168.0.20-index3 /var/www/html/index3.html # 访问测试 [rootclient ~]# curl 172.25.254.100/index.html webserver1-192.168.0.10 [rootclient ~]# curl 172.25.254.100/index1.html 192.168.0.20-index1 [rootclient ~]# curl 172.25.254.100/index2.html 192.168.0.10-index2 [rootclient ~]# curl 172.25.254.100/index3.html 192.168.0.20-index33.3 url_paramurl_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器多用于电商通常用于追踪用户以确保来自同一个用户的请求始终发往同一个real server如果没有key将按roundrobin算法#假设 url http://www.doubledragon.com/foo/bar/index.php?keyvalue #则 host www.doubledragon.com url_param keyvalue根据 URL 中的参数进行哈希计算确保相同参数后面#前面的部分的请求被发送到同一台后端服务器3.3.1 usl_param取模法配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance url_param name # 注意该处只能指定一个参数不能指定多个且必须指定一个 mode http server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1常见参数指定# 用户相关 balance url_param userid balance url_param user_id balance url_param uid balance url_param customer_id # 会话相关 balance url_param session_id balance url_param sessionid balance url_param sid balance url_param token balance url_param auth_token # 业务相关 balance url_param order_id balance url_param product_id balance url_param tenant_id balance url_param account_id # 自定义参数 balance url_param my_custom_param balance url_param xyz123 balance url_param anything_you_want3.3.2 url_param一致性hash配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance url_param userid # 注意该处只能指定一个参数不能指定多个且必须指定一个 hash-type consistent mode http server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 13.3.3 客户端访问测试# 相同参数会被调入到同一台主机 [rootclient ~]# curl 172.25.254.100/index.html?useriddoubledragon webserver1-192.168.0.10 [rootclient ~]# curl 172.25.254.100/index.html?useriddoubledragon webserver1-192.168.0.10 [rootclient ~]# curl 172.25.254.100/index.html?useriddoubledragon webserver1-192.168.0.103.4 hdr针对用户每个http头部(header)请求中的指定信息做hash此处由 name 指定的http首部将会被取出并做hash计算然后由服务器总权重取模以后派发至某挑出的服务器如果无有效值则会使用默认的轮询调度。3.4.1 hdr取模法配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance hdr(User-Agent) # 此处指定hash的是User-Agent浏览器/客户端类型必须要有指定不能省略 mode http server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1常见参数指定# 客户端信息 balance hdr(User-Agent) # 浏览器/客户端类型 balance hdr(Host) # 目标主机名 balance hdr(Referer) # 来源页面 # 自定义业务头 balance hdr(X-User-ID) # 用户 ID balance hdr(X-Tenant-ID) # 租户 ID balance hdr(X-Session-ID) # 会话 ID balance hdr(X-API-Key) # API 密钥 # 认证相关 balance hdr(Authorization) # 认证令牌 balance hdr(Cookie) # Cookie 信息 # 其他标准头 balance hdr(Accept-Language) # 语言偏好 balance hdr(X-Forwarded-For) # 客户端 IP balance hdr(Content-Type) # 内容类型3.4.2 一致hash配置示例listen webserver-cluster-80 bind 172.25.254.100:80 balance hdr(User-Agent) # 此处指定hash的是User-Agent浏览器/客户端类型必须要有指定不能省略 hash-type consistent mode http server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 13.4.3 客户端访问测试[rootclient ~]# curl -vA sougou 172.25.254.100 。。。内容省略 Webserver2-192.168.0.20 [rootclient ~]# curl -vA edge 172.25.254.100 。。。内容省略 Webserver2-192.168.0.20 [rootclient ~]# curl -vA edge 172.25.254.100 。。。内容省略 Webserver2-192.168.0.20 [rootclient ~]# curl -vA firefox 172.25.254.100 。。。内容省略 webserver1-192.168.0.10四、算法总结#静态 static-rr---------tcp/http first-------------tcp/http #动态 roundrobin--------tcp/http leastconn---------tcp/http random------------tcp/http #以下静态和动态取决于hash_type是否consistent source------------tcp/http Uri---------------http url_param---------http hdr---------------http五、算法适用场景first #使用较少 static-rr #做了session共享的web集群 roundrobin random leastconn #数据库 source #基于客户端公网IP的会话保持 Uri---------------http #缓存服务器CDN服务商蓝汛、百度、阿里云、腾讯 url_param---------http #可以实现session保持 hdr #基于客户端请求报文头部做下一步处理

相关新闻