一、Haproxy的算法
1.haproxy通过固定参数balance指明对后端服务器的调度算法,其中balance参数可以配置在listen或backend选项中
2.haproxy的调度算法分为静态和动态调度算法,其中有些算法可以根据参数在静态和动态算法中相互转换
3.静态算法:
按照事先定义好的规则轮询公平调度不关心后端服务器的当前负载、连接数和响应速度等并且不可以实时修改权重,只能靠重启haproxy生效
static-rr:基于权重的轮询调度
不支持运行时利用socat进行权重的动态调整
不支持服务器慢启动
其后端主机数量没有限制,相当于lvs中的wrr
慢启动是指在服务器刚刚启动上不会把它所应该承担的访问压力全部给它,即先给一部分后再给一部分
listen webserver_80
bind 172.25.254.100:80
mode http
balance static-rr
server webserver1 192.168.0.101:80 weight 2 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 2 check inter 3s fall 3 rise 5
first:根据服务器在列表中的位置自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务器
其会忽略服务器的权重设置
不支持用socat进行动态修改权重
listen webserver_80
bind 172.25.254.100:80
mode http
balance first
server webserver1 192.168.0.101:80 maxconn 3 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
4.动态算法
基于后端服务器的状态进行适当的调整
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整
roundrobin:
基于权重的轮询动态调度算法
支持权重的运行时调整
haproxy中roundrobin支持慢启动
每个后端对多支持4095个real server
该调度算法为默认调度算法
listen webserver_80
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
动态调整权重
leastconn:加权最少连接的动态
支持权重的运行时调整和慢启动,根据当前最少的后端服务器而非权重进行优先调度并且支持长连接的使用场景使用
listen webserver_80
bind 172.25.254.100:80
mode http
balance leastconn
server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
4.其他算法
source(源地址hash并将请求转发到后端服务器,之后同一个源地址请求将被转发到同一个后端web服务器)
map-base取模法:对source地址进行hash计算再基于服务器总权重取模,缺点是当服务器的总权重发生变化时有服务器上线或下线都会因总权重发生变化而导致调度结果的整体改变
一致性hash:当服务器的总权重发生变化时对调度结果的影响时局部的,不会引起大的变动
uri:基于对用户请求的url的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定的服务器
url_param:对用户请求的url中的params部分中的一个参数key对应的value值做hash计算,并由总权重相除以后派发给某个服务器,后端搜索同一个数据会被调度到同一个服务器
hdr:针对用户http头部请求中的指定信息做hash,一般由name指定的http首部将会被取出来做hash运算,如果无有效值,则默认使用轮询调度
上述这些算法的动态和静态取决于hash_type是否为consistent