江蘇一通信息科技有限公司

新聞資訊

致力于幫助合作伙伴構建基于一通科技的業(yè)務(wù)實(shí)踐和解決方案
這些高性能負載均衡架構知識點(diǎn),90%的人分不清!
作者:etonnet 來(lái)源:51CTO 日期:2019-11-7 15:41:38 人氣:5974
單服務(wù)器無(wú)論如何優(yōu)化,無(wú)論采用多好的硬件,總會(huì )有一個(gè)性能天花板,當單服務(wù)器的性能無(wú)法滿(mǎn)足業(yè)務(wù)需求時(shí),就需要設計高性能集群來(lái)提升系統整體的處理性能。高性能集群的本質(zhì)很簡(jiǎn)單,通過(guò)增加更多的服務(wù)器來(lái)提升系統整體的計算能力。由于計算本身存在一個(gè)特點(diǎn):同樣的輸入數據和邏輯,無(wú)論在哪臺服務(wù)器上執行,都應該得到相同的輸出。因此高性能集群設計的復雜度主要體現在任務(wù)分配這部分,需要設計合理的任務(wù)分配策略,將計算任務(wù)分配到多臺服務(wù)器上執行。高性能集群的復雜性主要體現在需要增加一個(gè)任務(wù)分配器,以及為任務(wù)選擇一個(gè)合適的任務(wù)分配算法。對于任務(wù)分配器,現在更流行的通用叫法是“負載均衡器”。但這個(gè)名稱(chēng)有一定的誤導性,會(huì )讓人潛意識里認為任務(wù)分配的目的是要保持各個(gè)計算單元的負載達到均衡狀態(tài)。而實(shí)際上任務(wù)分配并不只是考慮計算單元的負載均衡,不同的任務(wù)分配算法目標是不一樣的,有的基于負載考慮,有的基于性能(吞吐量、響應時(shí)間)考慮,有的基于業(yè)務(wù)考慮??紤]到“負載均衡”已經(jīng)成為了事實(shí)上的標準術(shù)語(yǔ),這里我也用“負載均衡”來(lái)代替“任務(wù)分配”,但請你時(shí)刻記住,負載均衡不只是為了計算單元的負載達到均衡狀態(tài)。

負載均衡分類(lèi)

常見(jiàn)的負載均衡系統包括3種:DNS負載均衡、硬件負載均衡和軟件負載均衡。
DNS負載均衡

DNS是最簡(jiǎn)單也是最常見(jiàn)的負載均衡方式,一般用來(lái)實(shí)現地理級別的均衡。例如,北方的用戶(hù)訪(fǎng)問(wèn)北京的機房,南方的用戶(hù)訪(fǎng)問(wèn)深圳的機房。DNS負載均衡的本質(zhì)是DNS解析同一個(gè)域名可以返回不同的IP地址。例如,同樣是www.baidu.com,北方用戶(hù)解析后獲取的地址是61.135.165.224(這是北京機房的IP),南方用戶(hù)解析后獲取的地址是14.215.177.38(這是深圳機房的IP)。下面是DNS負載均衡的簡(jiǎn)單示意圖:



DNS負載均衡實(shí)現簡(jiǎn)單、成本低,但也存在粒度太粗、負載均衡算法少等缺點(diǎn)。仔細分析一下優(yōu)缺點(diǎn),其優(yōu)點(diǎn)有:
? 簡(jiǎn)單、成本低:負載均衡工作交給DNS服務(wù)器處理,無(wú)須自己開(kāi)發(fā)或者維護負載均衡設備。
? 就近訪(fǎng)問(wèn),提升訪(fǎng)問(wèn)速度:DNS解析時(shí)可以根據請求來(lái)源IP,解析成距離用戶(hù)最近的服務(wù)器地址,可以加快訪(fǎng)問(wèn)速度,改善性能。
缺點(diǎn)有:
? 更新不及時(shí):DNS緩存的時(shí)間比較長(cháng),修改DNS配置后,由于緩存的原因,還是有很多用戶(hù)會(huì )繼續訪(fǎng)問(wèn)修改前的IP,這樣的訪(fǎng)問(wèn)會(huì )失敗,達不到負載均衡的目的,并且也影響用戶(hù)正常使用業(yè)務(wù)。
? 擴展性差:DNS負載均衡的控制權在域名商那里,無(wú)法根據業(yè)務(wù)特點(diǎn)針對其做更多的定制化功能和擴展特性。
? 分配策略比較簡(jiǎn)單:DNS負載均衡支持的算法少;不能區分服務(wù)器的差異(不能根據系統與服務(wù)的狀態(tài)來(lái)判斷負載);也無(wú)法感知后端服務(wù)器的狀態(tài)。
針對DNS負載均衡的一些缺點(diǎn),對于時(shí)延和故障敏感的業(yè)務(wù),有一些公司自己實(shí)現了HTTP-DNS的功能,即使用HTTP協(xié)議實(shí)現一個(gè)私有的DNS系統。這樣的方案和通用的DNS優(yōu)缺點(diǎn)正好相反。
硬件負載均衡
硬件負載均衡是通過(guò)單獨的硬件設備來(lái)實(shí)現負載均衡功能,這類(lèi)設備和路由器、交換機類(lèi)似,可以理解為一個(gè)用于負載均衡的基礎網(wǎng)絡(luò )設備。目前業(yè)界典型的硬件負載均衡設備有兩款:F5和A10。這類(lèi)設備性能強勁、功能強大,但價(jià)格都不便宜,一般只有“土豪”公司才會(huì )考慮使用此類(lèi)設備。普通業(yè)務(wù)量級的公司一是負擔不起,二是業(yè)務(wù)量沒(méi)那么大,用這些設備也是浪費。
硬件負載均衡的優(yōu)點(diǎn)是:
? 功能強大:全面支持各層級的負載均衡,支持全面的負載均衡算法,支持全局負載均衡。
? 性能強大:對比一下,軟件負載均衡支持到10萬(wàn)級并發(fā)已經(jīng)很厲害了,硬件負載均衡可以支持100萬(wàn)以上的并發(fā)。
? 穩定性高:商用硬件負載均衡,經(jīng)過(guò)了良好的嚴格測試,經(jīng)過(guò)大規模使用,穩定性高。
? 支持安全防護:硬件均衡設備除具備負載均衡功能外,還具備防火墻、防DDoS攻擊等安全功能。
硬件負載均衡的缺點(diǎn)是:
? 價(jià)格昂貴:最普通的一臺F5就是一臺“馬6”,好一點(diǎn)的就是“Q7”了。
? 擴展能力差:硬件設備,可以根據業(yè)務(wù)進(jìn)行配置,但無(wú)法進(jìn)行擴展和定制。
軟件負載均衡
軟件負載均衡通過(guò)負載均衡軟件來(lái)實(shí)現負載均衡功能,常見(jiàn)的有Nginx和LVS,其中Nginx是軟件的7層負載均衡,LVS是Linux內核的4層負載均衡。4層和7層的區別就在于協(xié)議和靈活性,Nginx支持HTTP、E-mail協(xié)議;而LVS是4層負載均衡,和協(xié)議無(wú)關(guān),幾乎所有應用都可以做,例如,聊天、數據庫等。軟件和硬件的最主要區別就在于性能,硬件負載均衡性能遠遠高于軟件負載均衡性能。Ngxin的性能是萬(wàn)級,一般的Linux服務(wù)器上裝一個(gè)Nginx大概能到5萬(wàn)/秒;LVS的性能是十萬(wàn)級,據說(shuō)可達到80萬(wàn)/秒;而F5性能是百萬(wàn)級,從200萬(wàn)/秒到800萬(wàn)/秒都有(數據來(lái)源網(wǎng)絡(luò ),僅供參考,如需采用請根據實(shí)際業(yè)務(wù)場(chǎng)景進(jìn)行性能測試)。當然,軟件負載均衡的最大優(yōu)勢是便宜,一臺普通的Linux服務(wù)器批發(fā)價(jià)大概就是1萬(wàn)元左右,相比F5的價(jià)格,那就是自行車(chē)和寶馬的區別了。除了使用開(kāi)源的系統進(jìn)行負載均衡,如果業(yè)務(wù)比較特殊,也可能基于開(kāi)源系統進(jìn)行定制(例如,Nginx插件),甚至進(jìn)行自研。


軟件負載均衡的優(yōu)點(diǎn):
? 簡(jiǎn)單:無(wú)論是部署還是維護都比較簡(jiǎn)單。
? 便宜:只要買(mǎi)個(gè)Linux服務(wù)器,裝上軟件即可。
? 靈活:4層和7層負載均衡可以根據業(yè)務(wù)進(jìn)行選擇;也可以根據業(yè)務(wù)進(jìn)行比較方便的擴展,例如,可以通過(guò)Nginx的插件來(lái)實(shí)現業(yè)務(wù)的定制化功能。
其實(shí)下面的缺點(diǎn)都是和硬件負載均衡相比的,并不是說(shuō)軟件負載均衡沒(méi)法用。
? 性能一般:一個(gè)Nginx大約能支撐5萬(wàn)并發(fā)。
? 功能沒(méi)有硬件負載均衡那么強大。
? 一般不具備防火墻和防DDoS攻擊等安全功能。
負載均衡典型架構
前面我們介紹了3種常見(jiàn)的負載均衡機制:DNS負載均衡、硬件負載均衡、軟件負載均衡,每種方式都有一些優(yōu)缺點(diǎn),但并不意味著(zhù)在實(shí)際應用中只能基于它們的優(yōu)缺點(diǎn)進(jìn)行非此即彼的選擇,反而是基于它們的優(yōu)缺點(diǎn)進(jìn)行組合使用。具體來(lái)說(shuō),組合的基本原則為:
? DNS負載均衡用于實(shí)現地理級別的負載均衡;
? 硬件負載均衡用于實(shí)現集群級別的負載均衡;
? 軟件負載均衡用于實(shí)現機器級別的負載均衡。
以一個(gè)假想的實(shí)例來(lái)說(shuō)明一下這種組合方式,如下圖所示。


整個(gè)系統的負載均衡分為三層
? 地理級別負載均衡:www.xxx.com部署在北京、廣州、上海三個(gè)機房,當用戶(hù)訪(fǎng)問(wèn)時(shí),DNS會(huì )根據用戶(hù)的地理位置來(lái)決定返回哪個(gè)機房的IP,圖中返回了廣州機房的IP地址,這樣用戶(hù)就訪(fǎng)問(wèn)到廣州機房了。
? 集群級別負載均衡:廣州機房的負載均衡用的是F5設備,F5收到用戶(hù)請求后,進(jìn)行集群級別的負載均衡,將用戶(hù)請求發(fā)給3個(gè)本地集群中的一個(gè),我們假設F5將用戶(hù)請求發(fā)給了“廣州集群2”。
? 機器級別的負載均衡:廣州集群2的負載均衡用的是Nginx,Nginx收到用戶(hù)請求后,將用戶(hù)請求發(fā)送給集群里面的某臺服務(wù)器,服務(wù)器處理用戶(hù)的業(yè)務(wù)請求并返回業(yè)務(wù)響應。
需要注意的是,上圖只是一個(gè)示例,一般在大型業(yè)務(wù)場(chǎng)景下才會(huì )這樣用,如果業(yè)務(wù)量沒(méi)這么大,則沒(méi)有必要嚴格照搬這套架構。例如,一個(gè)大學(xué)的論壇,完全可以不需要DNS負載均衡,也不需要F5設備,只需要用Nginx作為一個(gè)簡(jiǎn)單的負載均衡就足夠了。
負載均衡算法
負載均衡算法數量較多,而且可以根據一些業(yè)務(wù)特性進(jìn)行定制開(kāi)發(fā),拋開(kāi)細節上的差異,根據算法期望達到的目的,大體上可以分為下面幾類(lèi)。
? 任務(wù)平分類(lèi):負載均衡系統將收到的任務(wù)平均分配給服務(wù)器進(jìn)行處理,這里的“平均”可以是絕對數量的平均,也可以是比例或者權重上的平均。
? 負載均衡類(lèi):負載均衡系統根據服務(wù)器的負載來(lái)進(jìn)行分配,這里的負載并不一定是通常意義上我們說(shuō)的“CPU負載”,而是系統當前的壓力,可以用CPU負載來(lái)衡量,也可以用連接數、I/O使用率、網(wǎng)卡吞吐量等來(lái)衡量系統的壓力。
? 性能最優(yōu)類(lèi):負載均衡系統根據服務(wù)器的響應時(shí)間來(lái)進(jìn)行任務(wù)分配,優(yōu)先將新任務(wù)分配給響應最快的服務(wù)器。
? Hash類(lèi):負載均衡系統根據任務(wù)中的某些關(guān)鍵信息進(jìn)行Hash運算,將相同Hash值的請求分配到同一臺服務(wù)器上。常見(jiàn)的有源地址Hash、目標地址Hash、session id hash、用戶(hù)ID Hash等。接下來(lái)介紹一下負載均衡算法以及它們的優(yōu)缺點(diǎn)。
輪詢(xún)
負載均衡系統收到請求后,按照順序輪流分配到服務(wù)器上。輪詢(xún)是最簡(jiǎn)單的一個(gè)策略,無(wú)須關(guān)注服務(wù)器本身的狀態(tài),例如:
? 某個(gè)服務(wù)器當前因為觸發(fā)了程序bug進(jìn)入了死循環(huán)導致CPU負載很高,負載均衡系統是不感知的,還是會(huì )繼續將請求源源不斷地發(fā)送給它。
? 集群中有新的機器是32核的,老的機器是16核的,負載均衡系統也是不關(guān)注的,新老機器分配的任務(wù)數是一樣的。
需要注意的是負載均衡系統無(wú)須關(guān)注“服務(wù)器本身狀態(tài)”,這里的關(guān)鍵詞是“本身”。也就是說(shuō),只要服務(wù)器在運行,運行狀態(tài)是不關(guān)注的。但如果服務(wù)器直接宕機了,或者服務(wù)器和負載均衡系統斷連了,這時(shí)負載均衡系統是能夠感知的,也需要做出相應的處理。例如,將服務(wù)器從可分配服務(wù)器列表中刪除,否則就會(huì )出現服務(wù)器已經(jīng)宕機了,任務(wù)還不斷地分配給它,這明顯是不合理的??偠灾?,“簡(jiǎn)單”是輪詢(xún)算法的優(yōu)點(diǎn),也是它的缺點(diǎn)。
加權輪詢(xún)
負載均衡系統根據服務(wù)器權重進(jìn)行任務(wù)分配,這里的權重一般是根據硬件配置進(jìn)行靜態(tài)配置的,采用動(dòng)態(tài)的方式計算會(huì )更加契合業(yè)務(wù),但復雜度也會(huì )更高。加權輪詢(xún)是輪詢(xún)的一種特殊形式,其主要目的就是為了解決不同服務(wù)器處理能力有差異的問(wèn)題。例如,集群中有新的機器是32核的,老的機器是16核的,那么理論上我們可以假設新機器的處理能力是老機器的2倍,負載均衡系統就可以按照2:1的比例分配更多的任務(wù)給新機器,從而充分利用新機器的性能。加權輪詢(xún)解決了輪詢(xún)算法中無(wú)法根據服務(wù)器的配置差異進(jìn)行任務(wù)分配的問(wèn)題,但同樣存在無(wú)法根據服務(wù)器的狀態(tài)差異進(jìn)行任務(wù)分配的問(wèn)題。
負載最低優(yōu)先
負載均衡系統將任務(wù)分配給當前負載最低的服務(wù)器,這里的負載根據不同的任務(wù)類(lèi)型和業(yè)務(wù)場(chǎng)景,可以用不同的指標來(lái)衡量。例如:
? LVS這種4層網(wǎng)絡(luò )負載均衡設備,可以以“連接數”來(lái)判斷服務(wù)器的狀態(tài),服務(wù)器連接數越大,表明服務(wù)器壓力越大。
? Nginx這種7層網(wǎng)絡(luò )負載系統,可以以“HTTP請求數”來(lái)判斷服務(wù)器狀態(tài)(Nginx內置的負載均衡算法不支持這種方式,需要進(jìn)行擴展)。
? 如果我們自己開(kāi)發(fā)負載均衡系統,可以根據業(yè)務(wù)特點(diǎn)來(lái)選擇指標衡量系統壓力。如果是CPU密集型,可以以“CPU負載”來(lái)衡量系統壓力;如果是I/O密集型,可以以“I/O負載”來(lái)衡量系統壓力。負載最低優(yōu)先的算法解決了輪詢(xún)算法中無(wú)法感知服務(wù)器狀態(tài)的問(wèn)題,由此帶來(lái)的代價(jià)是復雜度要增加很多。例如:
? 最少連接數優(yōu)先的算法要求負載均衡系統統計每個(gè)服務(wù)器當前建立的連接,其應用場(chǎng)景僅限于負載均衡接收的任何連接請求都會(huì )轉發(fā)給服務(wù)器進(jìn)行處理,否則如果負載均衡系統和服務(wù)器之間是固定的連接池方式,就不適合采取這種算法。例如,LVS可以采取這種算法進(jìn)行負載均衡,而一個(gè)通過(guò)連接池的方式連接MySQL集群的負載均衡系統就不適合采取這種算法進(jìn)行負載均衡。
? CPU負載最低優(yōu)先的算法要求負載均衡系統以某種方式收集每個(gè)服務(wù)器的CPU負載,而且要確定是以1分鐘的負載為標準,還是以15分鐘的負載為標準,不存在1分鐘肯定比15分鐘要好或者差。不同業(yè)務(wù)最優(yōu)的時(shí)間間隔是不一樣的,時(shí)間間隔太短容易造成頻繁波動(dòng),時(shí)間間隔太長(cháng)又可能造成峰值來(lái)臨時(shí)響應緩慢。負載最低優(yōu)先算法基本上能夠比較完美地解決輪詢(xún)算法的缺點(diǎn),因為采用這種算法后,負載均衡系統需要感知服務(wù)器當前的運行狀態(tài)。當然,其代價(jià)是復雜度大幅上升。通俗來(lái)講,輪詢(xún)可能是5行代碼就能實(shí)現的算法,而負載最低優(yōu)先算法可能要1000行才能實(shí)現,甚至需要負載均衡系統和服務(wù)器都要開(kāi)發(fā)代碼。

Hash類(lèi)
負載均衡系統根據任務(wù)中的某些關(guān)鍵信息進(jìn)行Hash運算,將相同Hash值的請求分配到同一臺服務(wù)器上,這樣做的目的主要是為了滿(mǎn)足特定的業(yè)務(wù)需求。例如:
? 源地址Hash
將來(lái)源于同一個(gè)源IP地址的任務(wù)分配給同一個(gè)服務(wù)器進(jìn)行處理,適合于存在事務(wù)、會(huì )話(huà)的業(yè)務(wù)。例如,當我們通過(guò)瀏覽器登錄網(wǎng)上銀行時(shí),會(huì )生成一個(gè)會(huì )話(huà)信息,這個(gè)會(huì )話(huà)是臨時(shí)的,關(guān)閉瀏覽器后就失效。網(wǎng)上銀行后臺無(wú)須持久化會(huì )話(huà)信息,只需要在某臺服務(wù)器上臨時(shí)保存這個(gè)會(huì )話(huà)就可以了,但需要保證用戶(hù)在會(huì )話(huà)存在期間,每次都能訪(fǎng)問(wèn)到同一個(gè)服務(wù)器,這種業(yè)務(wù)場(chǎng)景就可以用源地址Hash來(lái)實(shí)現。
? ID Hash
將某個(gè)ID標識的業(yè)務(wù)分配到同一個(gè)服務(wù)器中進(jìn)行處理,這里的ID一般是臨時(shí)性數據的ID(如session id)。例如,上述的網(wǎng)上銀行登錄的例子,用session id hash同樣可以實(shí)現同一個(gè)會(huì )話(huà)期間,用戶(hù)每次都是訪(fǎng)問(wèn)到同一臺服務(wù)器的目的。

下一個(gè):三分鐘了解到底虛擬化平臺能做什么?
QQ在線(xiàn)咨詢(xún)
售前技術(shù)咨詢(xún)
0512-55213186
售后客服熱線(xiàn)
13584999487