伺服器集群負載均衡原理?

在分散式集群環境中,如何把眾多並發請求分布到不同的伺服器上的呢?是通過DNS手段還是通過別的軟體手段呢(比如web伺服器軟體nginx、apache)?


當系統面臨大量用戶訪問,負載過高的時候,通常會使用增加伺服器數量來進行橫向擴展,使用集群和負載均衡提高整個系統的處理能力。

而我們討論的負載均衡一般分為兩種,一種是基於DNS,另一種基於IP報文。

利用DNS實現負載均衡,就是在DNS伺服器配置多個A記錄,不同的DNS請求會解析到不同的IP地址。大型網站一般使用DNS作為第一級負載均衡。

缺點是DNS生效時間略長,擴展性差。

基於IP的負載均衡,早期比較有代表性並且被大量使用的的就是LVS了。原理是LVS在Linux內核態獲取到IP報文後,根據特定的負載均衡演算法將IP報文轉發到整個集群的某台伺服器中去。

缺點是LVS的性能依賴Linux內核的網路性能,但Linux內核的網路路徑過長導致了大量開銷,使得LVS單機性能較低。

那麼有沒有更好的負載均衡技術呢?當然有。

Google於2016年3月最新公布的負載均衡Maglev就在此列。

Maglev是谷歌為自己的數據中心研發的解決方案,並於2008開始用於生產環境。在第十三屆網路系統設計與實現USENIX研討會(NSDI 『16)上, 來自谷歌、加州大學洛杉磯分校、SpaceX公司的工程師們分享了這一商用伺服器負載均衡器Maglev的詳細信息。Maglev安裝後不需要預熱5秒內就能應付每秒100萬次請求令人驚嘆不已。在谷歌的性能基準測試中,Maglev實例運行在一個8核CPU下,網路吞吐率上限為12M PPS(數據包每秒),如果Maglev使用Linux內核網路堆棧則速度會小於4M PPS。

無獨有偶,國內雲服務商 UCloud 進一步迭代了負載均衡產品——Vortex,成功地提升了單機性能。在技術實現上,UCloud Vortex與Google Maglev頗為相似。以一台普通性價比的x86 1U伺服器為例,Vortex可以實現吞吐量達14M PPS(10G, 64位元組線速),新建連接200k CPS以上,並發連接數達到3000萬、10G線速的轉發。

詳情請見:

從Goolge Maglev說起,如何造一個牛逼的負載均衡? - UCloud雲計算的文章 - 知乎專欄


負載均衡有硬體和軟體兩種.

硬體層的比較牛逼,將4-7層負載均衡功能做到一個硬體裡面,如F5,梭子魚,據說yahoo中國!早些時候只用了兩台F5做雙活.

目前主流的軟體負載均衡分為四層和七層

LVS屬於四層負載均衡,工作在tcp/ip協議棧上,通過修改網路包的ip地址和埠來轉發, 由於效率比七層高,一般放在架構的前端.

七層的負載均衡有nginx, haproxy, apache等, 工作在應用層,因此可以將HTTP請求等應用數據發送到具體的應用伺服器,如將圖片請求轉發到特定的伺服器上,總之可以做到更智能的負載均衡,這些功能在四層負載均衡上不好實現,一般放在架構的後面位置,布置在應用伺服器前面.


建議查看:

《構建高性能Web站點》第12章 web負載均衡

《大型網站技術架構:核心原理與案例分析》 6.2 應用伺服器集群的伸縮性設計

寫的比較詳細~

---------------------------------------------

下面的內容摘錄自以上兩書:

12.2 HTTP重定向

Web伺服器可通過Http響應頭信息中的Location標記來返回一個新的URL,瀏覽器自動去訪問這個新的URL。

實現:可以通過Web應用程序代碼實現你想到的調度策略,如可根據請求的URL的不同來進行合理的過濾和轉移。

12.3 DNS負載均衡

DNS負責將用戶請求的域名映射為實際的IP地址,這種映射可以是一對多的( DNS的A記錄,用來指定域名對應的IP地址),這樣DNS伺服器便充當負載均衡調度器。

DNS節省了所謂的主站點,DNS伺服器已經充當了主站點的職能。常見的策略是對多個A記錄進行RR(輪詢)

12.4 反向代理負載均衡

反向代理伺服器的核心工作是轉發HTTP,它工作在HTTP層面,因此,基於反向代理的負載均衡也稱為七層負載均衡。

任何對於實際伺服器的HTTP請求都必須經過調度器;調度器必須等待實際伺服器的HTTP響應,並將它反饋給用戶。

12.5 IP負載均衡

網路地址轉換(NAT)負載均衡工作在傳輸層,對數據包中的IP地址和埠進行修改,從而達到轉發的目的,稱為四層負載均衡。

NAT伺服器(前端伺服器)必須作為實際伺服器(後端伺服器)的網關,否則數據包被轉發後將一去不返。

12.6 直接路由

這種方式工作在數據鏈路層。它修改數據包的目標MAC地址,並沒有修改目標IP(因為這種轉發工作在數據鏈路層,它對上層埠無能為力),然後發給實際的伺服器,實際伺服器的響應數據直接發回給用戶,而不用經過調度器。但實際伺服器必須接入外網,而且不能將調度器作為默認網關,要給實際伺服器添加和調度器IP地址相同的IP別名。

12.7 IP隧道

基於IP隧道的負載均衡系統也可以使用LVS來實現,稱為LVS-TUN。與LVS-DR不同的是,實際伺服器和調度器可以不在同一個WAN網段,調度器通過IP隧道技術來轉發請求到實際伺服器,所以實際伺服器必須有合法的IP地址。

基於IP隧道的請求轉發機制,是將調度器收到的IP數據包封裝在一個新的IP數據包中,轉交給實際伺服器,然後實際伺服器的響應數據包可以直接到達用戶端。

基於IP隧道的獨特方式,可以將實際伺服器部署在不同的地域並根據就近原則轉移請求,比如一些CDN伺服器就是基於IP隧道技術實現的。


簡單說有global server load balance和local server load balance;global slb一般是跨機房跨區域的,主要在查詢DNS的時候根據就近原則返回距離client最近的機房的ip;local slb一般是部署在同一個機房或者區域內進行,可以通過修改IP,port,http header or body等方式來把流量分給多個server。

有兩本書可以參考:

關於SLB理論的《Load Balancing Servers, Firewalls, and Caches》

還有F5的BigIP實作的:《應用交付之F5 BIG-IP LTM》


負載均衡,核心就是網路流量分發,分很多維度。

從網路層看,基本是四層(TCP,UDP),和七層(HTTP,HTTPS等),基本就是解析到對應的網路層,然後根據不同特徵分發。比如四層的,基本就是根據連接信息(TCP)或者本身的特徵(源IP,目標IP)等做。七層的,就可以用域名(HTTP頭裡的Host),URL,Cookie,Header這些來做。

從實現上看,基本可以分軟負載均衡和反向代理:

  • 軟負載均衡不會過中間代理,網路rt,性能會較好,但是一般不好做精細的流量控制,有的方案還有延時問題。實現有DNS實現,iptables實現的方案。

  • 反向代理,故名思意就是通過代理來做。由於流量都會過LB,因此可以做到比較精細的流量分發(比如各種權重,七層的各種轉發規則)。壞處就是代理本身可能成為瓶頸,以及過了一層代理造成網路延時的增加。而代理本身也會有一定成本,因此實現成本較高。

從實現方式看,有軟體負載均衡和硬體負載均衡:

  • 軟體負載均衡的具體軟體實現有Nginx,Haproxy,LVS,以及比較古老的Apache等。現在比較新的做法是用dpdk這種內核bypass方案做的負載均衡,由於繞過了linux內核比較複雜的

    網路協議棧(人家本身就不是做負載均衡的。。。),因此性能會有明顯的提升(輕鬆跑滿萬兆網卡)。

  • 硬體負載均衡有大名鼎鼎的F5之類,這種不差錢的企業會採用。但是現在互聯網公司用的越來越少。現在硬體使用較多的是使用支持OSPF協議的交換機(基本都支持了),通過ECMP做的負載均衡集群。這個查查雲計算廠商的負載均衡文檔,大部分都是用這個作為分發集群的。性能非常好(隨便幾十G器),穩定性也很高。就是貴,搭建麻煩(需要機房支持),所以不是一般用戶搞的起的。不過這個也可以用軟體路由器(比如quagga這種)自己搭建一套軟體的OSPF集群,不過穩定性和性能相比硬體的要大打折扣。

每個雲服務都會提供負載均衡服務(負載均衡服務_流量分發服務-網易雲),拿來直接用就好啦,省時又省力,可以將更多精力放在核心業務上面。

相關閱讀:3分鐘帶你了解負載均衡服務


看帶寬,一般來說nginx做負載比較簡單,但單台伺服器的帶寬畢竟有限,1g了不起了,如果超過這個,就得用dns了,分片解析到一堆nginx,然後後面再掛負載均衡。在nginx流行之前,dns解析用的較多,主要是apache太弱了,以前相當於1級負載,現在中間加了一層nginx,2層結構,擴展更方便。另外業務也可以橫向區分的,比如淘寶的圖片伺服器,除了負載均衡,還有cdn。


外網智能路由是dns根據,用戶所在地解析最快dns,一般結合cdn。內網一般nginx,apache反向代理,tomat動態請求實現負載均衡,負載均衡演算法有,輪訓nginx,apache輪訓tomcat節點,請求轉發過去,tocmat計算完後,在返回給nginx、apache。url一致性hash,根據url hash值將固定url打到固定節點計算。加權輪訓,性能強機器權重大,流量大些,性能弱權中小,流量小些。


Google Maglev 牛逼的網路負載均衡器

我在這篇文章里介紹了下 3 層負載均衡的實現以及原理.

比較常用的還有 4 層負載均衡和 7 層負載均衡, 4 層開源的有 haproxy, 7 層就是 nginx 了, 它們兩的原理簡單說就是單點接收流量, 然後負載均衡到多個業務伺服器


可以看看國防科技大學章文嵩博士的學位論文,章文嵩是lvs的作者,他現在是阿里雲的負責人,2014年以前負責淘寶核心系統。


ospf+lvs+keepalived


負載均衡分硬體層和軟體層兩種。

題主可以了解下LVS,這是現在很流行的開源負載均衡軟體。

LVS負載均衡_互動百科


推薦閱讀:

為什麼 Erlang 流行不起來?
Hadoop和Spark解決了哪些並行資料庫沒解決的問題?
現在主流開源分散式系統架構都有哪些?
Paxos(Multi-Paxos)在工程實現中需要注意哪些問題?
如何理解Nvidia英偉達的Multi-GPU多卡通信框架NCCL?

TAG:分散式計算 | 伺服器 | 伺服器集群 | 集群 | 負載均衡 |