歡迎光臨
每天分享高質量文章

不懂高性能的負載均衡設計?沒關係,架構師帶你飛

(點擊上方公號,快速關註我們)


作者:王奎,個人公號:不止思考


在軟體系統的架構設計中,對集群的負載均衡設計是作為高性能系統優化環節中必不可少的方案。負載均衡本質上是用於將用戶流量進行均衡減壓的,因此在互聯網的大流量專案中,其重要性不言而喻。


一、什麼是負載均衡?


早期的互聯網應用,由於用戶流量比較小,業務邏輯也比較簡單,往往一個單服務器就能滿足負載需求。隨著現在互聯網的流量越來越大,稍微好一點的系統,訪問量就非常大了,並且系統功能也越來越複雜,那麼單台服務器就算將性能優化得再好,也不能支撐這麼大用戶量的訪問壓力了,這個時候就需要使用多台機器,設計高性能的集群來應對。


那麼,多台服務器是如何去均衡流量、如何組成高性能的集群的呢?


此時就需要請出 「負載均衡器」 入場了。


負載均衡(Load Balancer)是指把用戶訪問的流量,通過「負載均衡器」,根據某種轉發的策略,均勻的分發到後端多台服務器上,後端的服務器可以獨立的響應和處理請求,從而實現分散負載的效果。負載均衡技術提高了系統的服務能力,增強了應用的可用性。


(可以按照圖中去理解,圖片來源網絡)


二、負載均衡方案有幾種?


目前市面上最常見的負載均衡技術方案主要有三種:


  • 基於DNS負載均衡

  • 基於硬體負載均衡

  • 基於軟體負載均衡


三種方案各有優劣,DNS負載均衡可以實現在地域上的流量均衡,硬體負載均衡主要用於大型服務器集群中的負載需求,而軟體負載均衡大多是基於機器層面的流量均衡。在實際場景中,這三種是可以組合在一起使用。下麵來詳細講講:


1、基於DNS負載均衡


基於DNS來做負載均衡其實是一種最簡單的實現方案,通過在DNS服務器上做一個簡單配置即可。


其原理就是當用戶訪問域名的時候,會先向DNS服務器去解析域名對應的IP地址,這個時候我們可以讓DNS服務器根據不同地理位置的用戶傳回不同的IP。比如南方的用戶就傳回我們在廣州業務服務器的IP,北方的用戶來訪問的話,我就傳回北京業務服務器所在的IP。


在這個樣式下,用戶就相當於實現了按照「就近原則」將請求分流了,既減輕了單個集群的負載壓力,也提升了用戶的訪問速度。


使用DNS做負載均衡的方案,天然的優勢就是配置簡單,實現成本非常低,無需額外的開發和維護工作。


但是也有一個明顯的缺點是:當配置修改後,生效不及時。這個是由於DNS的特性導致的,DNS一般會有多級快取,所以當我們修改了DNS配置之後,由於快取的原因,會導致IP變更不及時,從而影響負載均衡的效果。


另外,使用DNS做負載均衡的話,大多是基於地域或者乾脆直接做IP輪詢,沒有更高級的路由策略,所以這也是DNS方案的局限所在。


2、基於硬體負載均衡

硬體的負載均衡那就比較牛逼了,比如大名鼎鼎的 F5 Network Big-IP,也就是我們常說的 F5,它是一個網絡設備,你可以簡單的理解成類似於網絡交換機的東西,完全通過硬體來抗壓力,性能是非常的好,每秒能處理的請求數達到百萬級,即 幾百萬/秒 的負載,當然價格也就非常非常貴了,十幾萬到上百萬人民幣都有。


因為這類設備一般用在大型互聯網公司的流量入口最前端,以及政府、國企等不缺錢企業會去使用。一般的中小公司是不捨得用的。


採用 F5 這類硬體做負載均衡的話,主要就是省心省事,買一臺就搞定,性能強大,一般的業務不在話下。而且在負載均衡的演算法方面還支持很多靈活的策略,同時還具有一些防火牆等安全功能。但是缺點也很明顯,一個字:貴。


3、基於軟體負載均衡

軟體負載均衡是指使用軟體的方式來分發和均衡流量。軟體負載均衡,分為7層協議 和 4層協議。


網絡協議有七層,基於第四層傳輸層來做流量分發的方案稱為4層負載均衡,例如 LVS,而基於第七層應用層來做流量分發的稱為7層負載均衡,例如 Nginx。這兩種在性能和靈活性上是有些區別的。


基於4層的負載均衡性能要高一些,一般能達到 幾十萬/秒 的處理量,而基於7層的負載均衡處理量一般只在 幾萬/秒 。


基於軟體的負載均衡的特點也很明顯,便宜。在正常的服務器上部署即可,無需額外採購,就是投入一點技術去優化優化即可,因此這種方式是互聯網公司中用得最多的一種方式。


三、常用的均衡演算法有哪些?


上面講完了常見的負載均衡技術方案,那麼接下來咱們看一下,在實際方案應用中,一般可以使用哪些均衡演算法?


  • 輪詢策略

  • 負載度策略

  • 響應策略

  • 哈希策略


下麵來分別介紹一下這幾種均衡演算法/策略的特點:


  1. 輪詢策略


輪詢策略其實很好理解,就是當用戶請求來了之後,「負載均衡器」將請求輪流的轉發到後端不同的業務服務器上。這個策略在DNS方案中用的比較多,無需關註後端服務的狀態,只藥有請求,就往後端輪流轉發,非常的簡單、實用。


在實際應用中,輪詢也會有多種方式,有按順序輪詢的、有隨機輪詢的、還有按照權重來輪詢的。前兩種比較好理解,第三種按照權重來輪詢,是指給每台後端服務設定一個權重值,比如性能高的服務器權重高一些,性能低的服務器給的權重低一些,這樣設置的話,分配流量的時候,給權重高的更多流量,可以充分的發揮出後端機器的性能。


  1. 負載度策略


負載度策略是指當「負載均衡器」往後端轉發流量的時候,會先去評估後端每台服務器的負載壓力情況,對於壓力比較大的後端服務器轉發的請求就少一些,對於壓力比較小的後端服務器可以多轉發一些請求給它。


這種方式就充分的結合了後端服務器的運行狀態,來動態的分配流量了,比輪詢的方式更為科學一些。


但是這種方式也帶來了一些弊端,因為需要動態的評估後端服務器的負載壓力,那這個「負載均衡器」除了轉發請求以外,還要做很多額外的工作,比如採集 連接數、請求數、CPU負載指標、IO負載指標等等,通過對這些指標進行計算和對比,判斷出哪一臺後端服務器的負載壓力較大。


因此這種方式帶來了效果優勢的同時,也增加了「負載均衡器」的實現難度和維護成本。


  1. 響應策略


響應策略是指,當用戶請求過來的時候,「負載均衡器」會優先將請求轉發給當前時刻響應最快的後端服務器。


也就是說,不管後端服務器負載高不高,也不管配置如何,只要覺得這個服務器在當前時刻能最快的響應用戶的請求,那麼就優先把請求轉發給它,這樣的話,對於用戶而言,體驗也最好。


那「負載均衡器」是怎麼知道哪一臺後端服務在當前時刻響應能力最佳呢?


這就需要「負載均衡器」不停的去統計每一臺後端服務器對請求的處理速度了,比如一分鐘統計一次,生成一個後端服務器處理速度的排行榜。然後「負載均衡器」根據這個排行榜去轉發服務。


那麼這裡的問題就是統計的成本了,不停的做這些統計運算本身也會消耗一些性能,同時也會增加「負載均衡器」的實現難度和維護成本。


  1. 哈希策略


Hash策略也比較好理解,就是將請求中的某個信息進行hash計算,然後根據後端服務器台數取模,得到一個值,算出相同值的請求就被轉發到同一臺後端服務器中。


常見的用法是對用戶的IP或者ID進行這個策略,然後「負載均衡器」就能保證同一個IP來源或者同一個用戶永遠會被送到同一個後端服務器上了,一般用於處理快取、會話等功能的時候特別好用。


以上,就是實現高性能負載均衡的常見技術方案和策略了,歡迎大家一起交流。

【關於作者】


王奎:不止思考的技術人,一名駐扎在武漢互聯網的程式員老兵,我有一個公眾號 bzsikao 平時寫一些工作的心得和技術文章。


【關於投稿】


如果大家有原創好文投稿,請直接給公號發送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接

② 示例:
【投稿】
《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/


③ 最後請附上您的個人簡介哈~

看完本文有收穫?請轉發分享給更多人

關註「資料分析與開發」,提升資料技能

赞(0)

分享創造快樂