HAProxy调度算法分为静态调度算法和动态调度算法。
静态算法是按照事先定义好的调度规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,而且没法实时修改权重,只能重启后生效。
静态调度算法有:static-rr,first
动态算法是根据后端服务器状态进行调度适当调整,好比优先调度至当前负载较低的服务器,而且权重能够在haproxy运行时调整,无需重启服务
动态调度算法有:roundrobin,leastconn,source,uri,url_param,hdr,rdp-cookie
定义方法:php
balance <调度算法>
静态轮询,基于权重轮询调度,不支持HAProxy在运行时进行权重调整和后端服务器的慢启动,后端的主机数量没有限制html
listen web_http mode http balance static-rr #设定静态轮询 bind 192.168.27.21:80 server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
测试:linux
[root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 2
HAProxy会根据服务器在列表中的位置,自上而下进行调度,只有当第一台服务器的链接数达到上限时,新的请求才会被分配到下一台服务器,此设置会忽略服务器的权重
示例:web
listen web_http mode http balance first bind 192.168.27.21:80 server web1 192.168.27.31:80 maxconn 10 check inter 3s fall 3 rise 5 #配置链接上线位为10,不设置权重 server web2 192.168.27.32:80 weight 2 check inter 3s fall 3 rise 5
测试:算法
[root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1
全部的请求依旧会发往server1,server2的权重设置无效,只有当server1的链接数占满时才将请求发送给server2windows
基于权重的轮询动态调度算法,支持权重的运行时调整,支持慢启动,每一个后端backend中最多支持4095个server,此为默认调度算法。
示例:
1.修改配置文件后端
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #将socket文件开启,在进行动态调节权重时,是经过socket进行的 listen web_http mode http balance roundrobin #调度算法设置为roundrobin bind 192.168.27.21:80 server web1 192.168.27.31:80 weight 1 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
2.建立socket文件的目录缓存
[root@localhost ~]# mkdir /var/lib/haproxy
3.重启服务器,查看socket文件是否启用bash
[root@localhost ~]# ls /var/lib/haproxy/ haproxy.sock #已经存在
测试:
动态调节服务器状态时须要使用到socat命令,先安装此命令服务器
[root@localhost ~]# yum install socat -y
socat的简单使用,能够经过echo+指令而后使用管道传送给socket文件
[root@localhost ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock #此命令能够用来查看socat一些简单的使用帮助
1.获取服务器权重
[root@localhost ~]# echo "get weight web_http/web1" | socat stdio /var/lib/haproxy/haproxy.sock #获取权重时,指定后端服务器组和服务器名称 1 (initial 1) 权重为1
2.动态修改权重,而后再次查看
[root@localhost ~]# echo "set weight web_http/web1 2" | socat stdio /var/lib/haproxy/haproxy.sock #使用set来修改权重, [root@localhost ~]# echo "get weight web_http/web1" | socat stdio /var/lib/haproxy/haproxy.sock 2 (initial 1)
测试访问
[root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 2 #权重已经被调整,须要注意动态设置的方法临时有效,重启服务将失效
将服务器动态下线
[root@localhost ~]# echo "disable server web_http/web1" | socat stdio /var/lib/haproxy/haproxy.sock
测试访问
[root@localhost ~]# curl 192.168.27.21 server 2 [root@localhost ~]# curl 192.168.27.21 server 2 #server1被下线,访问只能被调度到server2
将服务器动态上线
[root@localhost ~]# echo "enable server web_http/web1" | socat stdio /var/lib/haproxy/haproxy.sock
测试访问
[root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 2 #server1又能正常访问,而且以前设置的权重依旧有效
source调度算法是基于用户的源地址hash并将请求转发到后端服务器,默认为静态即取模方式(能够经过hash-type支持的选项进行更改),后续同一个地址发来的请求将都被转发为后端的同一个web服务器,比较适合用于session保持/缓存业务等场景
示例:
listen web_http mode http balance source bind 192.168.27.21:80 server web1 192.168.27.31:80 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 check inter 3s fall 3 rise 5
测试
[root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 [root@localhost ~]# curl 192.168.27.21 server 1 #当第一次访问被调度到后天的server1后以后的全部请求都被调度到server1
调度算法为源地址哈希是是没法进行权重的修改的,默认为静态
[root@localhost ~]# echo "set weight web_http/web1 2" | socat stdio /var/lib/haproxy/haproxy.sock Backend is using a static LB algorithm and only accepts weights '0%' and '100%'. #没法进行对权重进行设置,只能开启或关闭
源地址哈希因为是静态的,若是后端的服务器发生改变,取模后的值也将发生改变,以致于整张表上的记录做废,从而从新进行计算。
一致性哈希是动态的,支持在线的权重调整,当服务器的总权重发生变化时,影响的只是一部分,不会引发大的变更
示例:
listen web_http mode http balance source hash-type consistent #使用hash-type指定一致性哈希 bind 192.168.27.21:80 server web1 192.168.27.31:80 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 check inter 3s fall 3 rise 5
uri哈希算法,能够经过用户访问的uri来进行调度,经常使用于缓存服务器。当用户第一访问某uri是,haproxy会从后台选出一台服务进行调度并记录,当再其余用户也访问此uri时,haproxy会固定的将其调度到后台上次所请求此uri的那台服务器上。
示例:
将配置文件改成基于uri哈希的算法
listen web_http mode http balance uri #设置为uri算法 bind 192.168.27.21:80 server web1 192.168.27.31:80 weight 1 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 3 check inter 3s fall 3 rise 5
测试
分别使用不一样的客户端对相同的资源进行访问
使用client1进行访问
[root@client1 ~]# curl 192.168.27.21/index.html server 1
使用client2进行访问
[root@client2 ~]# curl 192.168.27.21/index.html server 1
使用client3进行访问
[root@client3 ~]# curl 192.168.27.21/index.html server 1
结论:不一样用户访问同一个资源将会调度到后台的统一个服务器上
url_param的调度算法是对用户请求的url中{params}部分中的参数的值作哈希计算,并由服务器总权重相除后派发至选中的后端服务器;经常使用于追踪用户确保同一个用户的请求永远发向同一台后端服务器。
假设url为http://www.mylinuxops.com/index.php?name=wang
其中url_param为?以后的内容即name=wang,而其中name为参数,wang为值
示例:
listen web_http mode http balance url_param name #设定调度算法为 url_param,参数为name bind 192.168.27.21:80 server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
测试
当用户所带的参数的值相同时则请求后台相同的服务器
[root@localhost ~]# curl 192.168.27.21/index.html?name=123 server 2 [root@localhost ~]# curl 192.168.27.21/index.html?name=123 server 2
当用户使用未设定的参数时,将轮询
[root@localhost ~]# curl 192.168.27.21/index.html?aaa=123 server 1 [root@localhost ~]# curl 192.168.27.21/index.html?aaa=123 server 1 [root@localhost ~]# curl 192.168.27.21/index.html?aaa=123 server 2
hdr调度算法是针对用户每一个http请求头部中指定的信息作hash,而后由服务器的总权重相除取模后派发至后端的服务器,若是没有有效的值则将进行轮询调度。hdr可使用的name有(cookie、User-agent、host)
示例:
listen web_http mode http #此算法是针对http的因此模式须要使用http balance hdr(user-agent) #使用hdr算法,以用户的客户端做调度 bind 192.168.27.21:80 server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5
示例:
使用curl访问时
[root@localhost ~]# curl 192.168.27.21 server 2 [root@localhost ~]# curl 192.168.27.21 server 2 [root@localhost ~]# curl 192.168.27.21 server 2 [root@localhost ~]# curl 192.168.27.21 server 2
使用curl模拟其余客户端访问
[root@localhost ~]# curl -A "12" 192.168.27.21 server 1 [root@localhost ~]# curl -A "12" 192.168.27.21 server 1 [root@localhost ~]# curl -A "12" 192.168.27.21
rdp-cookie调度算法是针对远程桌面的负载,使用cookie保持会话,用在远程为windows的状况下。
示例:
listen RDP bind 192.168.27.21:3389 balance rdp-cookie #修改调度算法为rdp-cookie mod tcp #因为后端为windows因此此处必须为tcp server rdp1 192.168.27.40:3389 check inter 3s fall 3 rise 5 server rdp1 192.168.27.40:3389 check inter 3s fall 3 rise 5