1.1 常见轮询算法介绍 roundrobin基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个
1.1 常见轮询算法介绍
roundrobin
基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
static-rr
基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
leastconn
新的连接请求被派发至具有最少连接数目的后端服务器.在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等;其并不太适用于较短会话的应用层协议,如HTTP.此算法是动态的,可以在运行时调整其权重
first
第一个具有可用连接槽的服务器得到连接.这些服务器将从最小到最大的id选择.一旦一个服务器到达它的最大连接数,下一个服务器将被使用.如果不定义每个服务器的maxconn参数,这个算法是无意义的.使用这个算法的目的是尽量使用最小数量的服务器以便于其他服务器可以在非密集时段待机.这个算法将忽略服务器权重
source
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器.常用于负载均衡无cookie功能的基于TCP的协议.其默认为静态,不过也可以使用hash-type修改此特性
uri
对URI的左半部分(“?”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器.这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化.此算法常用于代理缓存或反病毒代理以提高缓存的命中率.需要注意的是,此算法仅应用于HTTP后端服务器场景.其默认为静态算法,不过也可以使用hash-type修改此特性
url_param
通过< argument>为URL指定的参数在每个HTTP GET请求中将会被检索.如果找到了指定的参数且其通过等于号”=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器.此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化.如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度.此算法默认为静态的,不过其也可以使用hash-type修改此特性
hdr(< name>)
对于每个HTTP请求,通过< name>指定的HTTP首部将会被检索.如果相应的首部没有出现或其没有有效值,则使用轮询算法对相应请求进行调度.其有一个可选选项”use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.baidu.com来说,仅计算”baidu”字符串的hash值)以降低hash算法的运算量.此算法默认为静态的,不过其也可以使用hash-type修改此特性
1.2 线上配置算法使用(仅供参考)
cat /etc/haproxy/haproxy.cfg
global #全局定义
chroot /var/lib/haproxy
daemon
group haproxy
log 127.0.0.1 local2 info
maxconn 40960
pidfile /var/run/haproxy.pid
spread-checks 3
stats socket /var/lib/haproxy/stats
user haproxy
nbthread 16
defaults
log global
option tcplog
maxconn 40960
mode http
option redispatch
option http-server-close
option dontlognull
balance source ## 设置haproxy的调度算法为源地址hash
retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
timeout http-request 40s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
listen haproxy_stats #haproxy自己定义
mode http
bind 10.0.0.191:8888
option httplog
stats refresh 30s
stats uri /status
stats realm Haproxy Manager
stats auth xxxx:xxxx
####
#BEGIN listen for OpenStack mariadb-server BEGIN#
listen mariadb
bind mariadb.cty.os:10024
mode tcp
balance source #设置haproxy的调度算法为源地址hash
option httpchk
option tcplog
timeout client 1800s
timeout server 1800s
#监测的间隔时长毫秒 inter 2000
#监测正常多少次后被认为后端服务器是可用的 rise 2
#监测失败多少次后被认为后端服务器是不可用 fall 5
server node-1 10.0.0.180:18913 check port 39000 inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18913 backup check port 39000 inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18913 backup check port 39000 inter 2000 rise 2 fall 5
#END listen for OpenStack mariadb-server END#
# BEGIN listen for OpenStack keystone BEGIN
listen keystone-admin
bind keystone-admin.cty.os:10006
balance roundrobin #基于权重进行轮询
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18896 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18896 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18896 check inter 2000 rise 2 fall 5
listen keystone-public
bind keystone-public.cty.os:10008
balance roundrobin
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18897 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18897 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18897 check inter 2000 rise 2 fall 5
# END listen for OpenStack keystone END
#BEGIN listen for OpenStack Glance BEGIN#
listen glance-api
bind glance-api.cty.os:10002
balance roundrobin
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18894 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18894 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18894 check inter 2000 rise 2 fall 5
#END listen for OpenStack Glance END#
#BEGIN listen for OpenStack cinder BEGIN#
listen cinder-api
bind cinder-api.cty.os:10014
balance roundrobin
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18900 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18900 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18900 check inter 2000 rise 2 fall 5
#END listen for OpenStack cinder END#
#BEGIN listen for OpenStack neutron-server BEGIN#
listen neutron
bind neutron-server.cty.os:10018
balance roundrobin
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18912 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18912 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18912 check inter 2000 rise 2 fall 5
#END listen for OpenStack neutron-server END#
#BEGIN listen for OpenStack nova-api BEGIN#
listen nova-api
bind nova-api.cty.os:10010
balance roundrobin
option tcpka
option httpchk
option httplog
server node-1 10.0.0.180:18898 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18898 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18898 check inter 2000 rise 2 fall 5
#END listen for OpenStack nova-api END#
#BEGIN listen for OpenStack nova-placement BEGIN#
listen nova-placement
bind nova-placement-api.cty.os:10013
balance roundrobin
option tcpka
option httplog
server node-1 10.0.0.180:18887 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18887 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18887 check inter 2000 rise 2 fall 5
#END listen for OpenStack nova-placement END#
#BEGIN listen for OpenStack nova-metadata-api BEGIN#
listen nova-metadata-api
bind nova-api-metadata.cty.os:10012
balance roundrobin
option tcpka
option httplog
server node-1 10.0.0.180:18899 check inter 2000 rise 2 fall 5
server node-2 10.0.0.181:18899 check inter 2000 rise 2 fall 5
server node-3 10.0.0.182:18899 check inter 2000 rise 2 fall 5
#END listen for OpenStack nova-metadata-api END#