在linux下有Nginx筷凤、LVS瓢捉、 Haproxy 等等服務(wù)可以提供負(fù)載均衡服務(wù),而且Nginx提供了幾種分配方式(策略):
負(fù)載均衡策略
策略 | 方式 |
---|---|
輪詢 | 默認(rèn)方式 |
weight | 權(quán)重方式 |
ip_hash | 依據(jù)ip分配方式 |
least_conn | 最少連接方式 |
fair(第三方) | 響應(yīng)時間方式 |
url_hash(第三方) | 依據(jù)URL分配方式 |
-
1捉偏、輪詢(默認(rèn))
每個請求按時間順序逐一分配到不 同的后端服務(wù)器捷兰,如果后端服務(wù)器down掉,能自動剔除
有如下參數(shù):
參數(shù) | 解釋 |
---|---|
fail_timeout | 與max_fails結(jié)合使用固阁。 |
max_fails | 設(shè)置在fail_timeout參數(shù)設(shè)置的時間內(nèi)最大失敗次數(shù)壤躲,如果在這個時間內(nèi),所有針對該服務(wù)器的請求都失敗了备燃,那么認(rèn)為該服務(wù)器會被認(rèn)為是停機了 |
fail_time | 服務(wù)器會被認(rèn)為停機的時間長度,默認(rèn)為10s碉克。 |
backup | 標(biāo)記該服務(wù)器為備用服務(wù)器。當(dāng)主服務(wù)器停止時并齐,請求會被發(fā)送到它這里漏麦。 |
down | 標(biāo)記服務(wù)器永久停機了 |
-
2、weight 權(quán)重
weight代表權(quán)重默認(rèn)為1,權(quán)重越高被分配的客戶端越多况褪。
指定輪詢幾率撕贞,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況测垛。例如:
upstream server_pool
server 192.168.5.21:80 weight=2;
server 192.168.5.22:80;
}
-
3捏膨、ip hash
每個請求按訪問ip的hash結(jié)果分配, 這樣每個訪客固定訪問一個后端服務(wù)器,可以解訣session的問題。例如:
upstream server_pool
ip_hash
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4食侮、least_conn(最少連接方式)
把請求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器号涯。輪詢算法是把請求平均的轉(zhuǎn)發(fā)給各個后端目胡,使它們的負(fù)載大致相同;但是诚隙,有些請求占用的時間很長讶隐,會導(dǎo)致其所在的后端負(fù)載較高。這種情況下久又,least_conn這種方式就可以達到更好的負(fù)載均衡效果
#動態(tài)服務(wù)器組
upstream dynamic_zuoyu {
least_conn; #把請求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器
server localhost:8080 weight=2; #tomcat 7.0
server localhost:8081; #tomcat 8.0
server localhost:8082 backup; #tomcat 8.5
server localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0
}
5巫延、第三方策略
第三方的負(fù)載均衡策略的實現(xiàn)需要安裝第三方插件。
① fair (第三方)
按后端服務(wù)器的響應(yīng)時間來分配請求地消,響應(yīng)時間短的優(yōu)先分配
upstream server_pool
server 192.168.5.21:80;
server 192.168.5.22:80;
fair; #實現(xiàn)響應(yīng)時間短的優(yōu)先分配
}
②url_hash(第三方)
按訪問url的hash結(jié)果來分配請求炉峰,使每個url定向到同一個后端服務(wù)器,要配合緩存命中來使用脉执。同一個資源多次請求疼阔,可能會到達不同的服務(wù)器上,導(dǎo)致不必要的多次下載半夷,緩存命中率不高婆廊,以及一些資源時間的浪費。而使用url_hash巫橄,可以使得同一個url(也就是同一個資源請求)會到達同一臺服務(wù)器淘邻,一旦緩存住了資源,再此收到請求湘换,就可以從緩存中讀取宾舅。
upstream dynamic_zuoyu {
hash $request_uri; #實現(xiàn)每個url定向到同一個后端服務(wù)器
server 192.168.5.21:80;
server 192.168.5.22:80;
}