haproxy调度算法详解一

dbhllnr 2020-01-09

HAProxy调度算法

HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

haproxy基于socat动态调整权重

socat是linux下的一个多功能网络工具,socat的主要特点是在两个数据流之间建立通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPV6、socket文件等。
使用echo把命令打印出来,通过管道传送给socat;socat需要添加stdio,以标准io(标准输入输出)的方式接收管道传送过来的指令,把传送过来的指令发送socket文件,socket文件会调用进程处理发送过来的请求;unix socket只能用于本地通讯,不能跨服务器通信
[ ~]# yum install socat
[ ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock         #查看haproxy的socket帮助信息
[ ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock    #查看haproxy的状态信息
[ ~]# echo "disable server yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock #以动态的方式禁用web1这个后端服务器;指定listen的name及需要禁用的后端服务器的name
[ ~]# echo "get weight yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock    #查看后端web1服务器的权重
[ ~]# echo "set weight yewu-service-80/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock  #修改后端web1服务器的权重为3,只能修改动态算法的权重;静态算法修改权重只能修改配置文件
注:使用命令行修改的信息,只是临时修改,只要重启服务就会失效,所以以配置文件为准。

静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。

static-rr静态轮询

static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动(慢启动是新增加的服务器会逐渐增加请求数,而不会一次性添加流量),其后端主机数量没有限制。

示例:
listen yewu-service-80
 bind 192.168.38.37:80
 mode http
 balance static-rr
 option forwardfor
 server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
 server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5
只能通过修改配置文件修改权重,修改完重启服务或者reload

first

first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数(TCP连接)达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。

示例:
listen yewu-service-80
 bind 192.168.38.37:80
 mode http
 balance first
 option forwardfor
 server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
 server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

动态算法

动态算法:基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。

roundrobin

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中(每个listen)最多支持4095个real server,roundrobin为默认调度算法,且支持对real server权重动态调整。

示例:
listen yewu-service-80
 bind 192.168.38.37:80
 mode http
 balance roundrobin           #默认设置,可以不添加
 option forwardfor
 server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
 server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

leastconn

leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接的场景使用,比如MySQL等场景。

示例:
listen yewu-service-80
 bind 192.168.38.37:80
 mode http
 balance leastconn
 option forwardfor
 server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
 server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

其他算法

其他部分算法即可作为静态算法,又可以通过选项成为动态算法

source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
用户第一次请求会通过hash被分配到一台服务器,第二次请求则也会通过对用户的源地址做hash运算,然后对后端服务器的总权重进行取模,根据取得的模,分配到对应权重的后端服务器,以此实现会话保持(取模的得数是不可能等于总权重的,如果取模的得数等于总权重,则会进1,就会取不到模,所以取模的得数只会小于总权重)。
源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
map-base取模法
map-based:取模法,基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变,不推荐使用此算法
所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3,(2^32-1)%(1+1+2)
一致性hash
haproxy调度算法详解一

<code>haproxy会把用户请求的源地址做hash,并且把hash后的值存放到内存中的一个虚拟表中,虚拟表中记录了一个范围内的hash值所对应的后端服务器;haproxy会根据hash值顺序寻找所对应的主机,当一个后端服务器宕机,haproxy会把代理到宕机服务器的请求顺序重定向到宕机服务器的hash范围后面的主机上。不会影响宕机服务器的hash范围前的请求,只会影响宕机服务器当前hash范围内的请求。 一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n 。

示例:

listen yewu-service-80
 bind 192.168.38.37:80
 mode http
 balance source
 hash-type consistent          #必须添加此项,不添加此项算法将会为取模法,并且不支持动态修改权重
 option forwardfor
 server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
 server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

相关推荐