title: Nginx負(fù)載均衡策略
date: 2018-11-01 10:47:35
tags:
- Nginx
- 負(fù)載均衡
- 學(xué)習(xí)筆記
Nginx負(fù)載均衡策略
概要
- Nginx工作在OSI的第七層停做,可以這對http應(yīng)用做一些分流策略蒸殿;
- Nginx反向代理服務(wù)的核心主要是轉(zhuǎn)發(fā)Http請求待笑,扮演了瀏覽器后端和后端服務(wù)器中轉(zhuǎn)的角色;
- Nginx官方測試支持5萬并發(fā)連接僚饭,在實際生產(chǎn)環(huán)境中可以到2-3萬并發(fā)數(shù)連接,1萬個非活躍http keep-alive連接占用約2.5M內(nèi)存呀伙。3萬并發(fā)連接下寇壳,10個Nginx進(jìn)程,消耗內(nèi)存約150M朱躺;
- 負(fù)載均衡的目的是為了解決單個節(jié)點壓力過大刁赖,導(dǎo)致Web服務(wù)響應(yīng)慢的問題;
內(nèi)置負(fù)載策略
策略
-
輪循(round-robin)默認(rèn)策略
- 根據(jù)請求次數(shù)室琢,將每個請求均勻分配到每臺服務(wù)器,如果后端服務(wù)器宕機乾闰,自動剔除。
-
權(quán)重(Weight)
- 把請求更多的分配到高配置的后端服務(wù)器上盈滴,默認(rèn)每個服務(wù)器的權(quán)重都是1。
-
ip_hash
- 同一客戶端的Web請求被分發(fā)到同一個后端服務(wù)器進(jìn)行處理,使用該策略可以有效的避免用戶Session失效的問題巢钓。該策略可以連續(xù)產(chǎn)生1045個互異的value病苗,經(jīng)過20次hash仍然找不到可用的機器時,算法會退化成輪循症汹。
-
最少連接(last_conn)
- Web請求會被轉(zhuǎn)發(fā)到連接數(shù)最少的服務(wù)器上硫朦。
參數(shù)說明
- weight
- 啟用權(quán)重策略,總數(shù)按照10進(jìn)行計算背镇,如果分配為3咬展,則表示所有連接中的30%分配給該服務(wù)器,默認(rèn)值為1;
- max_fail/fail_time
- 某臺服務(wù)器允許請求失敗的次數(shù)瞒斩,超過最大數(shù)后破婆,在fail_timeout時間內(nèi),新的請求不會分配給這臺機器胸囱,如果設(shè)置為0祷舀,反向代理服務(wù)器則會將這臺服務(wù)器設(shè)置為永久無效狀態(tài)。fail_time默認(rèn)為10秒烹笔;
- backup
- 將某臺服務(wù)器設(shè)定為備用機裳扯,當(dāng)列表中的其他服務(wù)器都不可用時,啟用備用機
- down
- 將某臺服務(wù)器設(shè)定為不可用狀態(tài)
- max_conns
- 限制分配給某臺服務(wù)器的最大連接數(shù)谤职,超過這個數(shù)量饰豺,反向代理服務(wù)器將不會分配新的連接,默認(rèn)為0允蜈,表示不限制哟忍;
代碼
http { upstream server_group_name { # ip_hash; # 啟用ip_hash策略 # last_conn; #啟用最少連接策略 server ip or domain:port weight=2 max_fails=3 fail_timeout=15 max_conns=1000; # 使用weight設(shè)置權(quán)重為20% server ip or domain:port backup; # 設(shè)置為備用機,當(dāng)其他服務(wù)器全部宕機時陷寝,啟用備用服務(wù)器 server ip or domain:port down; # 設(shè)置服務(wù)器為不可用狀態(tài) } server { listen 80; location / { proxy_pass http://server_group_name; } } }
擴(kuò)展策略
策略
擴(kuò)展策略默認(rèn)不被編譯進(jìn)nginx內(nèi)核锅很,如果啟用該策略,需要自行編譯安裝
-
fair
- 根據(jù)后臺服務(wù)器的響應(yīng)時間判斷負(fù)載情況凤跑,從中選出負(fù)載最輕的后端服務(wù)爆安。但是在實際請款中,網(wǎng)絡(luò)環(huán)境往往不那么簡單仔引,所以慎用扔仓。
- 在編譯安裝后,如果需要啟用該策略咖耘,需要在upstream標(biāo)簽中添加
fair;
,啟用該策略后翘簇,加權(quán)輪循將失效。
-
url_hash
- 按照請求url的hash結(jié)果來分配請求儿倒,試每個url定向到同一個后端服務(wù)器版保,在1.7.2之后的nginx版本中呜笑,該模塊應(yīng)集成到內(nèi)核中,不需要單獨安裝彻犁。
- 啟用該策略叫胁,需要在upstream標(biāo)簽中添加
hash $request_url;
問題
- 使用Nginx的反向代理,讓同一個用戶的請求一定轉(zhuǎn)發(fā)到同一臺服務(wù)器上汞幢,這種均衡策略會消耗更多的服務(wù)器資源驼鹅,也增加了代理服務(wù)器的負(fù)擔(dān);
- 使用其他策略作為負(fù)載均衡時森篷,會出現(xiàn)用戶Session丟失的情況输钩,為避免出現(xiàn)這種情況,可以將用戶的Session存放到緩存服務(wù)器中仲智,比較常用的方案時redis/memchache买乃;
- 反向代理服務(wù)器也可以開啟緩存服務(wù),但是開啟該項服務(wù)會增加代理服務(wù)器的負(fù)擔(dān)坎藐,影響整體的負(fù)載均衡效率为牍;
- 使用Nginx反向代理布置負(fù)載均衡,操作相對金丹岩馍,但是會有“單點故障”的問題碉咆,如果后臺某臺服務(wù)器宕機,會帶來很多的麻煩蛀恩,后期如果后臺服務(wù)器繼續(xù)增加疫铜,反向代理服務(wù)器會成為負(fù)載均衡方案的瓶頸。