當前位置:首頁 > IT技術(shù) > 編程語言 > 正文

HAProxy 調(diào)度算法
2022-02-14 14:15:53

HAProxy 調(diào)度算法_haproxy

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)度,不關(guān)心后端服務器的當前負載、連接數(shù)和響應速度等,且無法實時修改權(quán)重(只能為0和1,不支持其它值),只能靠重啟HAProxy生效

socat 工具

對服務器動態(tài)權(quán)重和其它狀態(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:基于權(quán)重的輪詢調(diào)度,不支持運行時利用socat進行權(quán)重的動態(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ù)達到上限,新請求才會分配給下一臺服務,因此會忽略服務器的權(quán)重設(shè)置,此方式使用較少不支持用socat進行動態(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

測試訪問效果

#同時運行下面命令,觀察結(jié)果
# 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)度至當前負載較低的服務器,且權(quán)重可以在haproxy運行時動態(tài)調(diào)整無需重啟

roundrobin

roundrobin:基于權(quán)重的輪詢動態(tài)調(diào)度算法,支持權(quán)重的運行時調(diào)整,不同于lvs中的rr輪訓模式,HAProxy中的roundrobin支持慢啟動(新加的服務器會逐漸增加轉(zhuǎn)發(fā)數(shù)),其每個后端backend中最多支持4095個real server,支持對real server權(quán)重動態(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)整權(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)的最少連接的動態(tài),支持權(quán)重的運行時調(diào)整和慢啟動,即:根據(jù)當前連接最少的后端服務器而非權(quá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的負載平衡算法,其基于隨機數(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計算,再基于服務器總權(quán)重的取模,最終結(jié)果決定將此請求轉(zhuǎn)發(fā)至對應的后端服務器。此方法是靜態(tài)的,即不支持在線調(diào)整權(quán)重,不支持慢啟動,可實現(xiàn)對后端服務器均衡調(diào)度。缺點是當服務器的總權(quán)重發(fā)生變化時,即有服務器上線或下線,都會因總權(quán)重發(fā)生變化而導致調(diào)度結(jié)果整體改變,hash-type 指定的默認值為此算法

所謂取模運算,就是計算兩個數(shù)相除之后的余數(shù),10%7=3, 7%4=3
map-based算法:基于權(quán)重取模,hash(source_ip)%所有后端服務器相加的總權(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
#不支持動態(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%'.

#只能動態(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

一致性哈希,當服務器的總權(quán)重發(fā)生變化時,對調(diào)度結(jié)果影響是局部的,不會引起大的變動,hash(o)mod n ,該hash算法是動態(tài)的,支持使用 socat等工具進行在線權(quán)重調(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ù)權(quán)重為1生成1000個虛擬IP,再hash。
而后端服務器權(quán)重為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

開通會員,享受整站包年服務立即開通 >