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