haproxy调度算法
haproxy调度算法
默认情况下是轮询。
1.1 静态算法
无法实时修改权重,必须重启haproxy。
#动态方式修改权重
yum install socat
#安装socat
echo "help" | socat stdio /apps/haproxy/haproxy.sock
#将help传给haproxy.sock 查看可用指令
echo "show info" | socat stdio /apps/haproxy/haproxy.sock
#查看haproxy运行状态
echo "get weight web-app1/web1 2" | socat stdio /apps/haproxy/haproxy.sock
#获取web-app1的后端服务器web1的权重
echo "set weight web-app1/web1 2" | socat stdio /apps/haproxy/haproxy.sock
#将web-app1的后端服务器web1的权重修改为2
echo "disable server web-app1/web1 2" | socat stdio /apps/haproxy/haproxy.sock
echo "enable server web-app1/web1 2" | socat stdio /apps/haproxy/haproxy.sock
#关闭/打开web-app1的后端服务器web1。1.1.1 static-rr 静态轮询
静态轮询,无法动态调整权重值。因为轮询各后端的服务器都是相等的(或者某台后端服务器的权重是0,即不进行转发)。
1.2.2 first
根据配置文件中的顺序进行转发。第一个服务器占完之后,才会将请求发给第二位的服务器。基本上不会使用。
1.2 动态算法
可以动态调整,将请求转发到较低负载的后端服务器上。且可以动态调整权重。
1.2.1 roundrobin(haproxy默认调度算法)
基于权重的轮询动态调度算法,支持权重的运行时调整。支持慢启动(对于新添加的后端服务器,负载缓慢增加,避免刚启动的服务接受太多连接。)每个后端backend中支持最多4095个real server。
1.2.2 leastconn
当前后端服务器中连接最少的优先调度。比较适合长连接使用,如mysql等。
1.2.3 hdr
对header请求中指定信息做hash。若值无效,则使用默认的轮询调度。
配置范例
balance hdr(User-Agent)
#取请求头中的user-agent进行hash
hash-type consistent1.2.4 rdp-cookie
可以实现对windows远程桌面负载,如果后端有多个windows 服务器,rdp-cookie可以实现同一个请求始终被转发给同一个后端服务器。如果此前从未访问,第一次连接时使用roundrobin算法计算出一个后端服务器进行转发。
配置范例
listen RDP
bind 192.168.1.1:3389
mode tcp
balance rdp-cookie
persist rdp-cookie
tcp-request inspect-delay 5s
tcp-request content accept if RDP_COOKIE
server win-server1 192.168.1.2:3389 check fall 3 raise 5 inter 2s weight 1 1.2.4 random
1.9版本后增加random算法,基于一个随机值作为一致性hash的key,随机负载平衡对于大型服务器场合或经常添加或删除服务器非常有用。
balance random1.3 算法总结
static rr => tcp/http 静态
frist => tcp/http 静态
roundrobin => tcp/http 动态
leastconn => tcp/http 动态
random => tcp/http 动态
source => tcp/http
uri => http
url_param => http 取决于hash_type是否consistent
hdr => http
rdp-cookie => tcp1.4 算法应用场景
frist => #使用较少
static-rr => #做了session共享的web集群
rounderobin =>
random =>
leastsonn => #数据库
source => #基于客户端公网IP的会话保持
uri =>http #缓存服务器,CDN服务器
url_param =>http
hdr => #基于客户端请求报文头部做下一步处理
rdp-cookie => #很少使用