HAProxy通過固定參數(shù) balance 指明對(duì)后端服務(wù)器的調(diào)度算法,該參數(shù)可以配置在listen或backend選項(xiàng)中。
HAProxy的調(diào)度算法分為靜態(tài)和動(dòng)態(tài)調(diào)度算法,但是有些算法可以根據(jù)參數(shù)在靜態(tài)和動(dòng)態(tài)算法中相互轉(zhuǎn)換。
官方文檔:??http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance????
靜態(tài)算法
靜態(tài)算法:按照事先定義好的規(guī)則輪詢公平調(diào)度,不關(guān)心后端服務(wù)器的當(dāng)前負(fù)載、連接數(shù)和響應(yīng)速度等,且無法實(shí)時(shí)修改權(quán)重(只能為0和1,不支持其它值),只能靠重啟HAProxy生效
socat 工具
對(duì)服務(wù)器動(dòng)態(tài)權(quán)重和其它狀態(tài)調(diào)整可以利用 socat工具,Socat 是 Linux 下的一個(gè)多功能的網(wǎng)絡(luò)工具,Socat 的主要特點(diǎn)就是在兩個(gè)數(shù)據(jù)流之間建立雙向通道,且支持眾多協(xié)議和鏈接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
yum -y install socat
static-rr
static-rr:基于權(quán)重的輪詢調(diào)度,不支持運(yùn)行時(shí)利用socat進(jìn)行權(quán)重的動(dòng)態(tài)調(diào)整(只支持0和1,不支持其它值)及后端服務(wù)器慢啟動(dòng),其后端主機(jī)數(shù)量沒有限制,相當(dāng)于LVS中的 wrr
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode http
log global
balance static-rr
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5
first
first:根據(jù)服務(wù)器在列表中的位置,自上而下進(jìn)行調(diào)度,但是其只會(huì)當(dāng)?shù)谝慌_(tái)服務(wù)器的連接數(shù)達(dá)到上限,新請(qǐng)求才會(huì)分配給下一臺(tái)服務(wù),因此會(huì)忽略服務(wù)器的權(quán)重設(shè)置,此方式使用較少不支持用socat進(jìn)行動(dòng)態(tài)修改權(quán)重,可以設(shè)置0和1,可以設(shè)置其它值但無效
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode http
log global
balance first
server web1 10.0.0.17:80 maxconn 2 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5
測(cè)試訪問效果
#同時(shí)運(yùn)行下面命令,觀察結(jié)果
# while true;do curl http://10.0.0.7/index.html ; sleep 0.1;done
動(dòng)態(tài)算法
動(dòng)態(tài)算法:基于后端服務(wù)器狀態(tài)進(jìn)行調(diào)度適當(dāng)調(diào)整,新請(qǐng)求將優(yōu)先調(diào)度至當(dāng)前負(fù)載較低的服務(wù)器,且權(quán)重可以在haproxy運(yùn)行時(shí)動(dòng)態(tài)調(diào)整無需重啟
roundrobin
roundrobin:基于權(quán)重的輪詢動(dòng)態(tài)調(diào)度算法,支持權(quán)重的運(yùn)行時(shí)調(diào)整,不同于lvs中的rr輪訓(xùn)模式,HAProxy中的roundrobin支持慢啟動(dòng)(新加的服務(wù)器會(huì)逐漸增加轉(zhuǎn)發(fā)數(shù)),其每個(gè)后端backend中最多支持4095個(gè)real server,支持對(duì)real server權(quán)重動(dòng)態(tài)調(diào)整,roundrobin為默認(rèn)調(diào)度算法,此算法使用廣泛
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode http
log global
balance roundrobin
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5
支持動(dòng)態(tài)調(diào)整權(quán)重
# echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
1 (initial 1)
# echo "set weight web_host/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock
# echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
3 (initial 1)
leastconn
leastconn加權(quán)的最少連接的動(dòng)態(tài),支持權(quán)重的運(yùn)行時(shí)調(diào)整和慢啟動(dòng),即:根據(jù)當(dāng)前連接最少的后端服務(wù)器而非權(quán)重進(jìn)行優(yōu)先調(diào)度(新客戶端連接),比較適合長連接的場景使用,比如:MySQL等場景
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode http
log global
balance leastconn
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5
random
在1.9版本開始增加 random的負(fù)載平衡算法,其基于隨機(jī)數(shù)作為一致性hash的key,隨機(jī)負(fù)載平衡對(duì)于大型服務(wù)器場或經(jīng)常添加或刪除服務(wù)器非常有用,支持weight的動(dòng)態(tài)調(diào)整,weight較大的主機(jī)有更大概率獲取新請(qǐng)求
random配置實(shí)例
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode http
log global
balance random
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5
其他算法(動(dòng)靜均可使用)
其它算法即可作為靜態(tài)算法,又可以通過選項(xiàng)成為動(dòng)態(tài)算法
source
源地址hash,基于用戶源地址hash并將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器,后續(xù)同一個(gè)源地址請(qǐng)求將被轉(zhuǎn)發(fā)至同一個(gè)后端web服務(wù)器。此方式當(dāng)后端服務(wù)器數(shù)據(jù)量發(fā)生變化時(shí),會(huì)導(dǎo)致很多用戶的請(qǐng)求轉(zhuǎn)發(fā)至新的后端服務(wù)器,默認(rèn)為靜態(tài)方式,但是可以通過hash-type支持的選項(xiàng)更改
這個(gè)算法一般是在不插入Cookie的TCP模式下使用,也可給拒絕會(huì)話cookie的客戶提供最好的會(huì)話粘性,適用于session會(huì)話保持但不支持cookie和緩存的場景
源地址有兩種轉(zhuǎn)發(fā)客戶端請(qǐng)求到后端服務(wù)器的服務(wù)器選取計(jì)算方式,分別是取模法和一致性hash
map-base 取模法
map-based:取模法,對(duì)source地址進(jìn)行hash計(jì)算,再基于服務(wù)器總權(quán)重的取模,最終結(jié)果決定將此請(qǐng)求轉(zhuǎn)發(fā)至對(duì)應(yīng)的后端服務(wù)器。此方法是靜態(tài)的,即不支持在線調(diào)整權(quán)重,不支持慢啟動(dòng),可實(shí)現(xiàn)對(duì)后端服務(wù)器均衡調(diào)度。缺點(diǎn)是當(dāng)服務(wù)器的總權(quán)重發(fā)生變化時(shí),即有服務(wù)器上線或下線,都會(huì)因總權(quán)重發(fā)生變化而導(dǎo)致調(diào)度結(jié)果整體改變,hash-type 指定的默認(rèn)值為此算法
所謂取模運(yùn)算,就是計(jì)算兩個(gè)數(shù)相除之后的余數(shù),10%7=3, 7%4=3
map-based算法:基于權(quán)重取模,hash(source_ip)%所有后端服務(wù)器相加的總權(quán)重
取模法配置示例:
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode tcp
log global
balance source
hash-type map-based
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 3
server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 3
#不支持動(dòng)態(tài)調(diào)整權(quán)重值
[root@haproxy ~]#echo "set weight web_host/10.0.0.27 10" | socat stdio
/var/lib/haproxy/haproxy.sock
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
#只能動(dòng)態(tài)上線和下線
[root@haproxy ~]#echo "set weight web_host/10.0.0.27 0" | socat stdio
/var/lib/haproxy/haproxy.sock
[root@haproxy conf.d]#echo "get weight web_host/10.0.0.27" | socat stdio
/var/lib/haproxy/haproxy.sock
0 (initial 1)
一致性hash
一致性哈希,當(dāng)服務(wù)器的總權(quán)重發(fā)生變化時(shí),對(duì)調(diào)度結(jié)果影響是局部的,不會(huì)引起大的變動(dòng),hash(o)mod n ,該hash算法是動(dòng)態(tài)的,支持使用 socat等工具進(jìn)行在線權(quán)重調(diào)整,支持慢啟動(dòng)
算法:
1、key1=hash(source_ip)%(2^32) [0---4294967295]
2、keyA=hash(后端服務(wù)器虛擬ip)%(2^32)
3、將key1和keyA都放在hash環(huán)上,將用戶請(qǐng)求調(diào)度到離key1最近的keyA對(duì)應(yīng)的后端服務(wù)器
hash環(huán)偏斜問題
增加虛擬服務(wù)器IP數(shù)量,比如:一個(gè)后端服務(wù)器根據(jù)權(quán)重為1生成1000個(gè)虛擬IP,再hash。
而后端服務(wù)器權(quán)重為2則生成2000的虛擬IP,再bash,最終在hash環(huán)上生成3000個(gè)節(jié)點(diǎn),從而解決hash環(huán)偏斜問題
一致性hash配置示例
listen web_host
bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
mode tcp
log global
balance source
hash-type consistent
server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5
本文摘自 :https://blog.51cto.com/l