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







