前言
HAProxy可以通过修改balance字段的值从而修改其调度算法,balance字段应用于”default”,”frontend”,”backend”字段中
balance < algorithm> [ < arguments> ]
balance url_param < param> [check_post]
Haproxy的八种负载均衡策略
roundrobin
- 基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
static-rr
- 基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
leastconn
- 新的连接请求被派发至具有最少连接数目的后端服务器.在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等;其并不太适用于较短会话的应用层协议,如HTTP.此算法是动态的,可以在运行时调整其权重
first
- 第一个具有可用连接槽的服务器得到连接.这些服务器将从最小到最大的id选择.一旦一个服务器到达它的最大连接数,下一个服务器将被使用.如果不定义每个服务器的maxconn参数,这个算法是无意义的.使用这个算法的目的是尽量使用最小数量的服务器以便于其他服务器可以在非密集时段待机.这个算法将忽略服务器权重
source
- 类似LVS中的sh算法;将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器.常用于负载均衡无cookie功能的基于TCP的协议.其默认为静态,不过也可以使用hash-type修改此特性
- hash类的算法动态与否取决于hash-type的值;如果我们定义hash-type的值为map-based(除权取余法)就表示该算法是静态算法,静态算法就不支持慢启动,动态调整权重;如果hash-type的值是consistent(一致性哈希)就表示该算法是动态算法,支持慢启动,动态权重调整;
uri
- 对URI的左半部分(“?”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器.这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化.此算法常用于代理缓存或反病毒代理以提高缓存的命中率.需要注意的是,此算法仅应用于HTTP后端服务器场景.其默认为静态算法,不过也可以使用hash-type修改此特性
- 这里说一下一个完整的rul的格式;< scheme>://[user:password@]:[/path][;params][?query][#frag]其中scheme,host,port这三项是必须有的,其他可有可无;这里说的uri就是指[/path][;params][?query][#frag]这一部分,而uri的左半部份指的是[/path][;params];所以uri算法是对用户请求的资源路径+参数做hash计算;
url_param
- 通过< argument>为URL指定的参数在每个HTTP GET请求中将会被检索.如果找到了指定的参数且其通过等于号”=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器.此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化.如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度.此算法默认为静态的,不过其也可以使用hash-type修改此特性
rdp-cookie(name)
- 示根据据cookie(name)来锁定并哈希每一次TCP请求
hdr(< name>)
- 对于每个HTTP请求,通过< name>指定的HTTP首部将会被检索.如果相应的首部没有出现或其没有有效值,则使用轮询算法对相应请求进行调度.其有一个可选选项”use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.baidu.com来说,仅计算”baidu”字符串的hash值)以降低hash算法的运算量.此算法默认为静态的,不过其也可以使用hash-type修改此特性
各项负载示例
roundrobin
#配置
balance roundrobin
server web1 192.168.10.203:80 weight 3 check
server web2 192.168.10.204:80 weight 1 check
static-rr
#配置
balance static-rr
server web1 192.168.10.203:80 weight 1 check
server web2 192.168.10.204:80 weight 3 check
leastconn
#配置
balance leastconn
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
first
#配置
balance first
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
source
#配置
balance source
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
uri
#配置
balance uri
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
url_param
同一param会被调度到同一台服务器,若没有param则会使用roundrobin算法
#配置文件
balance url_param test
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
#测试,同一param会被调度到同一台服务器,若没有param则会使用roundrobin算法
]# curl 192.168.10.201?test=one
welcome to web1
]# curl 192.168.10.201?test=one
welcome to web1
]# curl 192.168.10.201?test=1
welcome to web2
]# curl 192.168.10.201?test=1
welcome to web2
]# curl 192.168.10.201
welcome to web1
]# curl 192.168.10.201
welcome to web2
hdr(< name>)
#配置
balance hdr(user-agent)
server web1 192.168.10.203:80 check
server web2 192.168.10.204:80 check
#测试,不同的浏览器,不同的user-agent会被固定分配到不同的服务器
使用chrome:welcome to web1
使用ie:welcome to web2