20 | 高性能負載均衡:分類及架構

此爲筆記

課程鏈接

https://time.geekbang.org/column/intro/100006601?utm_source=time_web&utm_medium=menu&utm_term=timewebmenu

 

單服務器無論如何優化,無論採用多好的硬件,總會有一個性能天花板,當單服務器的性能無法滿足業務需求時,就需要設計高性能集羣來提升系統整體的處理性能。

高性能集羣的本質很簡單,通過增加更多的服務器來提升系統整體的計算能力。由於計算本身存在一個特點:同樣的輸入數據和邏輯,無論在哪臺服務器上執行,都應該得到相同的輸出。因此高性能集羣設計的複雜度主要體現在任務分配這部分,需要設計合理的任務分配策略,將計算任務分配到多臺服務器上執行。

高性能集羣的複雜性主要體現在需要增加一個任務分配器,以及爲任務選擇一個合適的任務分配算法。對於任務分配器,現在更流行的通用叫法是“負載均衡器”。但這個名稱有一定的誤導性,會讓人潛意識裏認爲任務分配的目的是要保持各個計算單元的負載達到均衡狀態。而實際上任務分配並不只是考慮計算單元的負載均衡,不同的任務分配算法目標是不一樣的,有的基於負載考慮,有的基於性能(吞吐量、響應時間)考慮,有的基於業務考慮。考慮到“負載均衡”已經成爲了事實上的標準術語,這裏我也用“負載均衡”來代替“任務分配”,但請你時刻記住,負載均衡不只是爲了計算單元的負載達到均衡狀態

今天我先來講講負載均衡的分類及架構,下一期會講負載均衡的算法。

負載均衡分類

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

DNS 負載均衡

DNS 是最簡單也是最常見的負載均衡方式,一般用來實現地理級別的均衡。例如,北方的用戶訪問北京的機房,南方的用戶訪問深圳的機房。DNS 負載均衡的本質是 DNS 解析同一個域名可以返回不同的 IP 地址。例如,同樣是 www.baidu.com,北方用戶解析後獲取的地址是 61.135.165.224(這是北京機房的 IP),南方用戶解析後獲取的地址是 14.215.177.38(這是深圳機房的 IP)。

下面是 DNS 負載均衡的簡單示意圖:

 (圖片來源:https://ww3.sinaimg.cn/large/006tNc79gy1fc7x8apfnyj30pk0ma765.jpg)

DNS 負載均衡實現簡單、成本低,但也存在粒度太粗、負載均衡算法少等缺點。仔細分析一下優缺點,其優點有:

  • 簡單、成本低:負載均衡工作交給 DNS 服務器處理,無須自己開發或者維護負載均衡設備。

  • 就近訪問,提升訪問速度:DNS 解析時可以根據請求來源 IP,解析成距離用戶最近的服務器地址,可以加快訪問速度,改善性能。

缺點有:

  • 更新不及時:DNS 緩存的時間比較長,修改 DNS 配置後,由於緩存的原因,還是有很多用戶會繼續訪問修改前的 IP,這樣的訪問會失敗,達不到負載均衡的目的,並且也影響用戶正常使用業務。

  • 擴展性差:DNS 負載均衡的控制權在域名商那裏,無法根據業務特點針對其做更多的定製化功能和擴展特性。

  • 分配策略比較簡單:DNS 負載均衡支持的算法少;不能區分服務器的差異(不能根據系統與服務的狀態來判斷負載);也無法感知後端服務器的狀態。

針對 DNS 負載均衡的一些缺點,對於時延和故障敏感的業務,有一些公司自己實現了 HTTP-DNS 的功能,即使用 HTTP 協議實現一個私有的 DNS 系統。這樣的方案和通用的 DNS 優缺點正好相反。

硬件負載均衡

硬件負載均衡是通過單獨的硬件設備來實現負載均衡功能,這類設備和路由器、交換機類似,可以理解爲一個用於負載均衡的基礎網絡設備。目前業界典型的硬件負載均衡設備有兩款:F5 和 A10。這類設備性能強勁、功能強大,但價格都不便宜,一般只有“土豪”公司纔會考慮使用此類設備。普通業務量級的公司一是負擔不起,二是業務量沒那麼大,用這些設備也是浪費。

硬件負載均衡的優點是:

  • 功能強大:全面支持各層級的負載均衡,支持全面的負載均衡算法,支持全局負載均衡。

  • 性能強大:對比一下,軟件負載均衡支持到 10 萬級併發已經很厲害了,硬件負載均衡可以支持 100 萬以上的併發。

  • 穩定性高:商用硬件負載均衡,經過了良好的嚴格測試,經過大規模使用,穩定性高。

  • 支持安全防護:硬件均衡設備除具備負載均衡功能外,還具備防火牆、防 DDoS 攻擊等安全功能。

硬件負載均衡的缺點是:

  • 價格昂貴:最普通的一臺 F5 就是一臺“馬 6”,好一點的就是“Q7”了。

  • 擴展能力差:硬件設備,可以根據業務進行配置,但無法進行擴展和定製。

軟件負載均衡

軟件負載均衡通過負載均衡軟件來實現負載均衡功能,常見的有 Nginx 和 LVS,其中 Nginx 是軟件的 7 層負載均衡,LVS 是 Linux 內核的 4 層負載均衡。4 層和 7 層的區別就在於協議靈活性,Nginx 支持 HTTP、E-mail 協議;而 LVS 是 4 層負載均衡,和協議無關,幾乎所有應用都可以做,例如,聊天、數據庫等。

軟件和硬件的最主要區別就在於性能,硬件負載均衡性能遠遠高於軟件負載均衡性能。Ngxin 的性能是萬級,一般的 Linux 服務器上裝一個 Nginx 大概能到 5 萬 / 秒;LVS 的性能是十萬級,據說可達到 80 萬 / 秒;而 F5 性能是百萬級,從 200 萬 / 秒到 800 萬 / 秒都有(數據來源網絡,僅供參考,如需採用請根據實際業務場景進行性能測試)。當然,軟件負載均衡的最大優勢是便宜,一臺普通的 Linux 服務器批發價大概就是 1 萬元左右,相比 F5 的價格,那就是自行車和寶馬的區別了。

除了使用開源的系統進行負載均衡,如果業務比較特殊,也可能基於開源系統進行定製(例如,Nginx 插件),甚至進行自研。

下面是 Nginx 的負載均衡架構示意圖:



軟件負載均衡的優點:

  • 簡單:無論是部署還是維護都比較簡單。

  • 便宜:只要買個 Linux 服務器,裝上軟件即可。

  • 靈活:4 層和 7 層負載均衡可以根據業務進行選擇;也可以根據業務進行比較方便的擴展,例如,可以通過 Nginx 的插件來實現業務的定製化功能。

其實下面的缺點都是和硬件負載均衡相比的,並不是說軟件負載均衡沒法用。

  • 性能一般:一個 Nginx 大約能支撐 5 萬併發。

  • 功能沒有硬件負載均衡那麼強大。

  • 一般不具備防火牆和防 DDoS 攻擊等安全功能。

負載均衡典型架構

前面我們介紹了 3 種常見的負載均衡機制:DNS 負載均衡、硬件負載均衡、軟件負載均衡,每種方式都有一些優缺點,但並不意味着在實際應用中只能基於它們的優缺點進行非此即彼的選擇,反而是基於它們的優缺點進行組合使用。具體來說,組合的基本原則爲:DNS 負載均衡用於實現地理級別的負載均衡;硬件負載均衡用於實現集羣級別的負載均衡;軟件負載均衡用於實現機器級別的負載均衡。

我以一個假想的實例來說明一下這種組合方式,如下圖所示。

整個系統的負載均衡分爲三層。

  • 地理級別負載均衡:www.xxx.com 部署在北京、廣州、上海三個機房,當用戶訪問時,DNS 會根據用戶的地理位置來決定返回哪個機房的 IP,圖中返回了廣州機房的 IP 地址,這樣用戶就訪問到廣州機房了。

  • 集羣級別負載均衡:廣州機房的負載均衡用的是 F5 設備,F5 收到用戶請求後,進行集羣級別的負載均衡,將用戶請求發給 3 個本地集羣中的一個,我們假設 F5 將用戶請求發給了“廣州集羣 2”。

  • 機器級別的負載均衡:廣州集羣 2 的負載均衡用的是 Nginx,Nginx 收到用戶請求後,將用戶請求發送給集羣裏面的某臺服務器,服務器處理用戶的業務請求並返回業務響應。

需要注意的是,上圖只是一個示例,一般在大型業務場景下才會這樣用,如果業務量沒這麼大,則沒有必要嚴格照搬這套架構。例如,一個大學的論壇,完全可以不需要 DNS 負載均衡,也不需要 F5 設備,只需要用 Nginx 作爲一個簡單的負載均衡就足夠了。

小結

今天我爲你講了負載均衡的常見分類以及典型架構,希望對你有所幫助。

這就是今天的全部內容,留一道思考題給你吧,假設你來設計一個日活躍用戶 1000 萬的論壇的負載均衡集羣,你的方案是什麼?設計理由是什麼?

歡迎你把答案寫到留言區,和我一起討論。相信經過深度思考的回答,也會讓你對知識的理解更加深刻。(編輯亂入:精彩的留言有機會獲得豐厚福利哦!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章