静态算法:
按照事先定义好的规则轮训公平调度,不关心后端服务器的当前负载、链接数和响应速度等,并且无法实时修改权重,只能靠重启HA生效。
服务器动态权重调整:
yum install socat #socat是一个多功能的网络工具,在两个数据流之间建立通道,支持多协议和链接方式 IP TCP UDP IPv6 Socket等
#echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
#echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
#echo "set weight web_host/web1 2" | socat stdio /ar/lib/haproxy/haproxy.sock
#echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
static-rr:
基于权重的轮训调度,不支持权重的运行时调整及后端服务器的慢启动,后端主机没有限制。
first:
根据服务器在列表中的位置,自上而下进行调度,但只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务器,因此会忽略服务器的权重设置。
动态算法:
基于后端服务器状态进行调度适当调整,如优先调度至当前负载较低的服务器,并且权重可以在haproxy运行时动态调整无需重启。
roundrobin:
基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮询模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数,)每个后端
backend中最多支持4095个real server,roundrobin为默认调度算法,支持对real server权重动态调整。
示例:
后端服务器为> server web1 192.168.92.184:80 weight 1 check inter 3000 fall 2 rise 5
获取当前权重> echo "get weight web_host/web1" | socat stdio /var/haproxy/haproxy.sock
修改权重----> echo "set weight web_host/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock
leastconn
加权最少连接,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),适合长连接的场景使用,mysql等。
其他算法
部分算法既可以作为静态算法,又可以通过选项称为动态算法。
source:
源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发到同一个后端web服务器,
适用于session保持/缓存等场景
源地址有两种转发客户端请求到后端服务器的服务器选取方式,去魔法和一致性hash
map-base取模法
基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,对后端服务器调度均衡,缺点:当服务器的总权重发生变化时(上线/下线),会因权重发生变化
而导致结果整体改变。
取模法:就是计算两个数相除之后的玉树,10%7=3,7%4=3,基于权重取模:(2^32-1)%(1+1+2)
一致性hash:
一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动.
uri:
基于对用户请求的uri做hash并将请求转发到后端指定服务器,也可以通过map-based和consistent定义使用取模法还是一致性hash。
url_param:
对用户请求的url中的params部分中的参数name作hash计算,并由服务器总权重相除以后派发至某服务器,常用语追踪用户,以确保来自同一个用的请求始终发往同一个real server
示例:url = http://www.magege.com/foo/bar/index.php?k1=v1&k2=v2
此时:
host = "www.magege.com"
url_param = "h1=v1&k2=v2"
url_param取模法:
listen web_host
bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
mode http
log global
balance url_param name,age #支持单个/多个url_param值hash
server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5
url_param一致性hash:
listen web_host
bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
mode http
log global
balance url_param name,age #支持单个/多个url_param值hash
hash-type consistent
server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5
hdr
针对用户每个http头部(header)请求中的指定信息做hash,此处由name指定的http首部将会被取出并做hash计算,然后由服务器总权重相除以后派发至服务器,如值无效,则
使用默认的轮询调度。
hdr取模法
listen web_host
bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
mode http
log global
balance hdr(User-Agent)
hash-type consistent
server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5
hdr一致性hash
listen web_host
bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
mode http
log global
balance hdr(User-Agent)
hash-type consistent
server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5
rdp-cookie:
对远程windows桌面的负载,使cookie保持会话
rdp-cookie取模法
listen RDP
bind 192.168.92.10:3389
mode tcp
balance rdp-cookie
hash-type tcp
server web1 192.168.10.12:3389 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:3389 weight 1 check inter 3000 fall 2 rise 5
rdp-cookie一致性hash
listen web_host
bind 192.168.92.10:3389
mode tcp
balance rdp-cookie
hash-type consistent
server web1 192.168.10.12:3389 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.10.13:3389 weight 1 check inter 3000 fall 2 rise 5
random:
1.9版本增加的一个算法,基于一个随机数作为一致性hash的key,随机负载平衡对于大型服务器场景或经常添加/删除服务器非常有用,它可以避免
在这种情况下由roundrobbin或leastconn导致的锤击效应。
总结
static-rr-------------------------->tcp/http-------------->静态
first------------------------------>tcp/http-------------->静态
roundrobin------------------------->tcp/http----------->动态
leastconn-------------------------->tcp/http------------>动态
random----------------------------->tcp/http----------->动态
source----------------------------->tcp/http------------>
uri-------------------------------->http------------------>
url_param-------------------------->http---------------->这几个取决于hash_tyep是否consistent
hdr-------------------------------->http----------------->
rdp-cookie------------------------->tcp----------------->
使用场景
first #使用较少
static-rr #做了session共享的web集群
roundrobin
random
leastconn #数据库
source #基于客户端公网IP的会话保持
uri #http #缓存服务器、CDN
url_param #http
hdr #基于客户端请求报文头部做下一步处理
rdp-cookie #很少使用