掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者: 田維常 2021-01-27 09:45:17
服務(wù)器
分布式 那今天我們就用生活中的故事來聊聊負(fù)載均衡。文章中部分可能有點(diǎn)啰嗦,但是為了更好能讓大家理解,我也是拼了

創(chuàng)新互聯(lián)于2013年成立,先為五指山等服務(wù)建站,五指山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為五指山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
最近有小伙伴在后臺(tái)留言,讓我寫一篇負(fù)載均衡的文章,說網(wǎng)上文章其實(shí)已經(jīng)很多了,每次都覺得某某文章講的不錯(cuò),可是一旦過段時(shí)間,啥都不記得了。那今天我們就用生活中的故事來聊聊負(fù)載均衡。文章中部分可能有點(diǎn)啰嗦,但是為了更好能讓大家理解,我也是拼了,真真切切的想讓大家掌握知識(shí)。
什么是負(fù)載均衡?
負(fù)載均衡,英文名稱為L(zhǎng)oad Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù)。
負(fù)載均衡通常有兩種目的:均攤壓力和提供冗余(也可以理解為備份)。
生活案列
上面還看不懂的話,我們繼續(xù)用生活案列來說:
高速路出口處,如果只有一個(gè)出口時(shí),突然有一天出現(xiàn)大量車輛(假設(shè)大家都沒有辦理ETC)這個(gè)高速出口下高速, 比如有幾百兩這會(huì)都要下高速,但是下高速要交過路費(fèi),每輛車至少也要耽擱幾分鐘,幾百輛!!!意味著后面的可能要等幾個(gè)小時(shí),如果有多個(gè)出口呢?那就沒必要等那么久了。
如果在增加一個(gè)出口,這時(shí)候就是兩個(gè)出口可以均攤車輛下高速,還得分收費(fèi)員快慢,車輛3看到車1那邊要快點(diǎn),然后就跟上車1。
如果再增加n個(gè)就可以想象效果了。但是太多了,貌似也會(huì)造成資源浪費(fèi),很多出口一天都沒有幾輛車出入,如果搞得太多豈不浪費(fèi),所以我們一般看到大多數(shù)都是兩個(gè),可以理解備用急用。
「我們就把司機(jī)理解為負(fù)載均衡器,可以根據(jù)前方路況進(jìn)行判別走哪個(gè)出口。判別的方法就可以理解為負(fù)載均衡算法?!?/p>
用我們技術(shù)領(lǐng)域的術(shù)語叫做冗余。收費(fèi)員的速度我就可以理解為我們系統(tǒng)某個(gè)服務(wù)的性能。
技術(shù)領(lǐng)域
下面用一張圖來描述我們技術(shù)領(lǐng)域的負(fù)載均衡:
結(jié)合生活中的場(chǎng)景和技術(shù)領(lǐng)域的場(chǎng)景一起理解更酸爽。
注意:集群指的是我們同一個(gè)App應(yīng)用服務(wù)的部署多個(gè)節(jié)點(diǎn),集群的主要目的就是為了分擔(dān)壓力的。負(fù)載均衡器(系統(tǒng))就可以理解為指揮員。來一個(gè)請(qǐng)求,指揮員把這個(gè)請(qǐng)求根據(jù)一定方法交給集群中的某個(gè)服務(wù)。指揮員就可以按照各種方式進(jìn)行分配請(qǐng)求到集群中的某個(gè)服務(wù)。隨機(jī)給、排隊(duì)給、誰反應(yīng)快給誰等方法,也就是形成了負(fù)載均衡算法。
以上比喻僅僅是個(gè)人理解。
負(fù)載均衡的種類
DNS
(Domain Name System 域名系統(tǒng) )它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便地訪問互聯(lián)網(wǎng)。DNS使用TCP和UDP端口53。當(dāng)前,對(duì)于每一級(jí)域名長(zhǎng)度的限制是63個(gè)字符,域名總長(zhǎng)度則不能超過253個(gè)字符。DNS是最簡(jiǎn)單也是最常見的負(fù)載均衡方式,一般用來實(shí)現(xiàn)“地理級(jí)別”的負(fù)載均衡,比如說:北方人訪問北京的機(jī)房,南方人訪問廣州的機(jī)房,西方人訪問成都的機(jī)房。DNS負(fù)載均衡的本質(zhì)是DNS解析同一個(gè)域名可以返回不同的IP地址。比如說:https://www.sina.com.cn/在北方的用戶使用時(shí)會(huì)解析成10.210.1.12(北京機(jī)房)返回,南方的用戶使用時(shí)會(huì)解析成14.213.164.27返回(廣州機(jī)房)。
DNS簡(jiǎn)單示意圖
優(yōu)點(diǎn)
缺點(diǎn)
實(shí)際的情況:在實(shí)際的項(xiàng)目部署,我們一般會(huì)將部分服務(wù)器使用DNS解析,利用域名解析作為第一級(jí)負(fù)載均衡.再在服務(wù)器中使用nginx負(fù)載均衡作為第二級(jí)負(fù)載均衡。
硬件負(fù)載均衡
硬件負(fù)載均衡是通過單獨(dú)的設(shè)備來實(shí)現(xiàn)負(fù)載均衡的功能,這類設(shè)備和路由器交換機(jī)有那么一些類似,更或者可以理解為一個(gè)用于負(fù)載均衡的基礎(chǔ)網(wǎng)絡(luò)設(shè)備。目前業(yè)界主要有兩款硬件負(fù)載均衡:F5和A10。這類設(shè)備性能好,功能強(qiáng)大,但是價(jià)格可以用昂貴來形容,一般只有銀行,國(guó)企等大型有錢的企業(yè)開會(huì)考慮使用此類設(shè)備,本人也只是在銀行里見識(shí)過F5。至于A10沒接觸過就不撤了。
優(yōu)點(diǎn)
功能強(qiáng)大:全面支持各層級(jí)的負(fù)載均衡,支持各種負(fù)載均衡算法,支持全局負(fù)載均衡。
性能好:一般軟件負(fù)載均衡能支撐10w+并發(fā)已經(jīng)很不錯(cuò)了,但是硬件的負(fù)載均衡卻可以支持100w+以上的并發(fā)。
高穩(wěn)定性:因?yàn)槭巧虡I(yè)品,所以經(jīng)過了良好嚴(yán)格的測(cè)試,經(jīng)過大規(guī)模的使用,所以穩(wěn)定非常高。
安全性高:硬件負(fù)載均衡設(shè)備除了能處理負(fù)載均衡以外,還具有防火墻、防DDOS攻擊等效果。
缺點(diǎn)
價(jià)格昂貴:我記得之前銀行購(gòu)買F5花了上百萬,據(jù)說還有更貴的,所以價(jià)格可想而知。
擴(kuò)展性不好:硬件設(shè)備可以根據(jù)業(yè)務(wù)進(jìn)行配置,但無法進(jìn)行擴(kuò)展和定制化。
軟件負(fù)載均衡
軟件負(fù)載均衡是通過負(fù)載均衡軟件來實(shí)現(xiàn)負(fù)載均衡功能的。常見的負(fù)載均衡軟件有LVS和Nginx。其中LVS是Linux內(nèi)核的四層負(fù)載均衡,四層和七層的區(qū)別在于他們協(xié)議和靈活性的不同。Nginx是7層負(fù)載均衡,支持HTTP,E-mail協(xié)議,而LVS是四層負(fù)載均衡,所以和協(xié)議無關(guān),基本上所有應(yīng)用都可以做到,比如說:聊天、數(shù)據(jù)庫(kù)等。
以下是Nginx的負(fù)載均衡簡(jiǎn)單示意圖:
優(yōu)點(diǎn)
缺點(diǎn)
負(fù)載均衡有什么用?
常用負(fù)載均衡算法
輪訓(xùn)
負(fù)載均衡系統(tǒng)接收到請(qǐng)求后,按照一定順序?qū)⒄?qǐng)求分發(fā)給服務(wù)器上。輪訓(xùn)是一種簡(jiǎn)單的負(fù)載均衡算法策略,不會(huì)去關(guān)注服務(wù)器狀態(tài)。
優(yōu)點(diǎn):如果服務(wù)器都是正常的,那么輪訓(xùn)是最理想的,因?yàn)樗鼤?huì)使得每個(gè)服務(wù)都得到相等量的請(qǐng)求,可以用"雨露均沾"來形容。
缺點(diǎn):上面的有點(diǎn)是理想狀態(tài)的,但是現(xiàn)實(shí)往往不是那樣的,現(xiàn)實(shí)還是很骨感滴,線上系統(tǒng)往往出現(xiàn)各種各樣的問題,比如:當(dāng)有一臺(tái)服務(wù)器掛了,輪訓(xùn)算法不會(huì)管服務(wù)器狀態(tài),就是會(huì)導(dǎo)致大量的請(qǐng)求到一臺(tái)已經(jīng)掛掉的服務(wù)器上,從而導(dǎo)致系統(tǒng)不可用,進(jìn)而造成用戶流失。另外一種常見的問題就是有的服務(wù)器響應(yīng)快,有的響應(yīng)慢(比如32核的服務(wù)器和16核的服務(wù)器),輪訓(xùn)算法也不關(guān)注相應(yīng)快慢,所以會(huì)導(dǎo)致很多服務(wù)請(qǐng)求響應(yīng)時(shí)間慢,簡(jiǎn)單的導(dǎo)致用戶體驗(yàn)不好,由于響應(yīng)時(shí)間慢甚至可能拖垮其他系統(tǒng)。
加權(quán)輪訓(xùn)
負(fù)載均衡系統(tǒng)根據(jù)服務(wù)器權(quán)重進(jìn)行請(qǐng)求任務(wù)分派到對(duì)應(yīng)的服務(wù)器上,這里的權(quán)重一般是根據(jù)系統(tǒng)硬件配置進(jìn)行靜態(tài)配置的,采用動(dòng)態(tài)的方式計(jì)算會(huì)更加適合業(yè)務(wù),但是復(fù)雜度相比簡(jiǎn)單的輪訓(xùn)就高很多。
加權(quán)輪訓(xùn)是輪訓(xùn)的一種特殊方式,主要目的是解決服務(wù)器處理能力的差異問題,比如:集群中有的服務(wù)器是32核,有的老系統(tǒng)卻是16核,那么理論上我們可以對(duì)其進(jìn)行權(quán)重配置值,即就是32核服務(wù)器的處理能力是16核的兩倍,負(fù)載均衡算法權(quán)重比例調(diào)整為2:1,讓更多的請(qǐng)求分發(fā)給32核的服務(wù)器。
加權(quán)輪訓(xùn)解決了輪訓(xùn)算法中誤服根據(jù)服務(wù)器的配置的差異任務(wù)進(jìn)行更好的分配的問題,其實(shí)還是會(huì)存在無法根據(jù)服務(wù)器的狀態(tài)差異性進(jìn)行請(qǐng)求任務(wù)分配的問題。
負(fù)載最低優(yōu)先
負(fù)載系統(tǒng)將請(qǐng)求分配給當(dāng)前負(fù)載最低的服務(wù)器,這里的負(fù)載根據(jù)不同請(qǐng)求類型和業(yè)務(wù)處理場(chǎng)景,可以用不同的指標(biāo)來衡量。比如以下幾個(gè)場(chǎng)景,
負(fù)載最低優(yōu)先算法解決了輪訓(xùn)算法中無法感知服務(wù)器狀態(tài)的問題,但是由此帶來的代價(jià)是復(fù)雜度增加很多,比如:
負(fù)載最低優(yōu)先的算法基板上能夠很完美解決了輪訓(xùn)算法的缺點(diǎn),也因?yàn)椴捎秘?fù)載最低優(yōu)先算法后,負(fù)載均衡系統(tǒng)需要感知服務(wù)器當(dāng)前運(yùn)行狀態(tài),此時(shí),同樣造成代價(jià)上升很多。對(duì)于開發(fā)者來說也許輪訓(xùn)算法只要簡(jiǎn)短的代碼就可以實(shí)現(xiàn),然而負(fù)載最低優(yōu)先算法需要大量的代碼來實(shí)現(xiàn)。
負(fù)載最低優(yōu)先看起來是解決了輪訓(xùn)中的缺點(diǎn),然后由于其復(fù)雜度的提升,導(dǎo)致真正使用中比例還不如輪訓(xùn)或者輪訓(xùn)加權(quán)算法。
性能最優(yōu)
負(fù)載最低優(yōu)先算法是站在服務(wù)器的角度來進(jìn)行請(qǐng)求分配的,而性能最優(yōu)算法是站在客戶端的角度進(jìn)行分配的,優(yōu)先將請(qǐng)求分配給處理速度快的服務(wù)器,通過這種方式達(dá)到了最快響應(yīng)給客戶端。
性能優(yōu)先其實(shí)也負(fù)載最低優(yōu)先有點(diǎn)類似,都是需要感知服務(wù)器的狀態(tài),與之不同的是性能最優(yōu)是通過響應(yīng)時(shí)間這個(gè)標(biāo)準(zhǔn),在外部進(jìn)行感應(yīng)服務(wù)器狀態(tài)而已,同樣的實(shí)現(xiàn)復(fù)雜度也很高,主要體現(xiàn)在以下方面:
Hash類
負(fù)載均衡系統(tǒng)根據(jù)請(qǐng)求中某些關(guān)鍵字進(jìn)行hash運(yùn)算,得到的相同值得分發(fā)到同一臺(tái)服務(wù)器上去,這樣做的目的主要是為了滿足特定的業(yè)務(wù)需求,比如:
負(fù)載均衡算法應(yīng)用
Dubbo中使用了哪些負(fù)載均衡算法?
類圖
nginx中使用了哪些負(fù)載均衡算法?
「round robin(默認(rèn))」:輪詢方式,依次將請(qǐng)求分配到各個(gè)后臺(tái)服務(wù)器中,默認(rèn)的負(fù)載均衡方式。適用于后臺(tái)機(jī)器性能一致的情況。掛掉的機(jī)器可以自動(dòng)從服務(wù)列表中剔除。
「weight」:根據(jù)權(quán)重來分發(fā)請(qǐng)求到不同的機(jī)器中,指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。 例如:
- upstream bakend {
- server 192.168.0.14 weight=10;
- server 192.168.0.15 weight=10;
- }
「IP_hash」:根據(jù)請(qǐng)求者ip的hash值將請(qǐng)求發(fā)送到后臺(tái)服務(wù)器中,可以保證來自同一ip的請(qǐng)求被打到固定的機(jī)器上,可以解決session問題。例如:
- upstream bakend {
- ip_hash;
- server 192.168.0.14:88;
- server 192.168.0.15:80;
- }
「url_hash(第三方)」:根據(jù)請(qǐng)求的url的hash值將請(qǐng)求分到不同的機(jī)器中,當(dāng)后臺(tái)服務(wù)器為緩存的時(shí)候效率高。
例如:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法 。
「fair(第三方)」:根據(jù)后臺(tái)響應(yīng)時(shí)間來分發(fā)請(qǐng)求,響應(yīng)時(shí)間短的分發(fā)的請(qǐng)求多。例如:
- upstream backend {
- server server1;
- server server2;
- fair;
- }
總結(jié)
我們用生活中的故事來講述了負(fù)載均衡,講述了什么是負(fù)載均衡,負(fù)載均衡的作用,負(fù)載均衡的種類,負(fù)載均衡算法種類,以及我們?cè)贒ubbo和nginx中負(fù)載均衡算法的應(yīng)用。
本文轉(zhuǎn)載自微信公眾號(hào)「Java后端技術(shù)全棧 」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java后端技術(shù)全棧 公眾號(hào)。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流