當前位置:
首頁 > 最新 > 負載均衡的技術原理分類演算法以及常用的實現方式

負載均衡的技術原理分類演算法以及常用的實現方式

概覽

本篇文章主要介紹了負載均衡的基本知識,在閱讀本篇文章之前建議首先了解一下OSI基本模型,TCP/IP協議的三次握手與四次揮手以及正向代理與反向代理。本篇文章涵蓋的知識點有:

負載均衡的基本概念及作用

負載均衡的分類以及實現原理

四層與七層負載均衡技術原理及使用場景

常見的負載均衡演算法

常見的負載均衡的實現

常用的負載均衡健康檢查機制

負載均衡實施要素

預先複習

(向上滑動查看複習寶典)

負載均衡的基本概念及作用

先對負載均衡做一個簡單的定義:負載均衡建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴展網路設備和伺服器的帶寬、增加吞吐量、加強網路數據處理能力、提高網路的靈活性和可用性。

因此負載均衡的作用有:

水平擴展網路設備和伺服器的帶寬

流量分發

對相應的節點做周期性的健康檢查,保證服務集群健康可用

做緩存增加web訪問速度

避免單點故障

提高複雜網路應用的靈活度,比如將對圖片類的請求轉發到特定的圖片伺服器並可以使用緩存技術;將對文字類的請求可以轉發到特定的文字伺服器並可以使用壓縮技術。

負載均衡的分類以及實現原理

目前有許多不同的負載均衡技術用以滿足不同的應用需求,下面從負載均衡所採用的設備對象、應用的地理結構及應用的網路層次(指OSI參考模型)等來分類。

軟/硬負載均衡

軟體負載均衡解決方案是指在一台或多台伺服器相應的操作系統上安裝一個或多個附加軟體來實現負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基於特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。

軟體解決方案缺點也較多,因為每台伺服器上安裝額外的軟體運行會消耗系統不定量的資源,越是功能強大的模塊,消耗得越多,所以當連接請求特別大的時候,軟體本身會成為伺服器工作成敗的一個關鍵;軟體可擴展性並不是很好,受到操作系統的限制;由於操作系統本身的Bug,往往會引起安全問題。

硬體負載均衡解決方案是直接在伺服器和外部網路間安裝負載均衡設備,這種設備我們通常稱之為負載均衡器,由於專門的設備完成專門的任務,獨立於操作系統,整體性能得到大量提高,加上多樣化的負載均衡策略,智能化的流量管理,可達到最佳的負載均衡需求。

負載均衡器有多種多樣的形式,除了作為獨立意義上的負載均衡器外,有些負載均衡器集成在交換設備中,置於伺服器與Internet鏈接之間,有些則以兩塊網路適配器將這一功能集成到PC中,一塊連接到Internet上,一塊連接到後端伺服器群的內部網路上。一般而言,硬體負載均衡在功能、性能上優於軟體方式,不過成本昂貴。

本地/全局負載均衡

負載均衡從其應用的地理結構上分為本地負載均衡(Local Load Balance)和全局負載均衡(Global Load Balance,也叫地域負載均衡),本地負載均衡是指對本地的伺服器群做負載均衡,全局負載均衡是指對分別放置在不同的地理位置、有不同網路結構的伺服器群間作負載均衡。

本地負載均衡能有效地解決數據流量過大、網路負荷過重的問題,並且不需花費昂貴開支購置性能卓越的伺服器,充分利用現有設備,避免伺服器單點故障造成數據流量的損失。其有靈活多樣的均衡策略把數據流量合理地分配給伺服器群內的伺服器共同負擔。即使是再給現有伺服器擴充升級,也只是簡單地增加一個新的伺服器到服務群中,而不需改變現有網路結構、停止現有的服務。

全局負載均衡主要用於在一個多區域擁有自己伺服器的站點,為了使全球用戶只以一個IP地址或域名就能訪問到離自己最近的伺服器,從而獲得最快的訪問速度,也可用於子公司分散站點分布廣的大公司通過Intranet(企業內部互聯網)來達到資源統一合理分配的目的。

網路層次負載均衡

針對網路上負載過重的不同瓶頸所在,從網路的不同層次入手,我們可以採用相應的負載均衡技術來解決現有問題。

四層負載均衡:是基於IP+埠的負載均衡;

七層負載均衡:是基於URL等應用層信息的負載均衡,通過虛擬的URL或主機名接收請求,然後再分配到真實的伺服器。

二層負載均衡:基於MAC地址的二層負載均衡,二層負載均衡會通過一個虛擬MAC地址接收請求,然後再分配到真實的MAC地址;

三層負載均衡:和基於IP地址的三層負載均衡,三層負載均衡會通過一個虛擬IP地址接收請求,然後再分配到真實的IP地址;

四層與七層負載均衡的原理及使用場景

技術原理

所謂四層負載均衡,也就是主要通過報文中的目標地址和埠,再加上負載均衡設備設置的伺服器選擇方式,決定最終選擇的內部伺服器。

以常見的TCP為例,負載均衡設備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的伺服器,並對報文中目標IP地址進行修改(改為後端伺服器IP),直接轉發給該伺服器。TCP的連接建立,即三次握手是客戶端和伺服器直接建立的,負載均衡設備只是起到一個類似路由器的轉發動作。在某些部署情況下,為保證伺服器回包可以正確返回給負載均衡設備,在轉發報文的同時可能還會對報文原來的源地址進行修改。

所謂七層負載均衡,也稱為「內容交換」,也就是主要通過報文中的真正有意義的應用層內容,再加上負載均衡設備設置的伺服器選擇方式,決定最終選擇的內部伺服器。

以常見的TCP為例,負載均衡設備如果要根據真正的應用層內容再選擇伺服器,只能先代理最終的伺服器和客戶端建立連接(三次握手)後,才可能接受到客戶端發送的真正應用層內容的報文,然後再根據該報文中的特定欄位,再加上負載均衡設備設置的伺服器選擇方式,決定最終選擇的內部伺服器。負載均衡設備在這種情況下,更類似於一個代理伺服器。負載均衡和前端的客戶端以及後端的伺服器會分別建立TCP連接。所以從這個技術原理上來看,七層負載均衡明顯的對負載均衡設備的要求更高,處理七層的能力也必然會低於四層模式的部署方式。那麼,為什麼還需要七層負載均衡呢?

應用場景

七層應用負載的好處,是使得整個網路更"智能化"。例如訪問一個網站的用戶流量,可以通過七層的方式,將對圖片類的請求轉發到特定的圖片伺服器並可以使用緩存技術;將對文字類的請求可以轉發到特定的文字伺服器並可以使用壓縮技術。當然這只是七層應用的一個小案例,從技術原理上,這種方式可以對客戶端的請求和伺服器的響應進行任意意義上的修改,極大的提升了應用系統在網路層的靈活性。很多在後台,例如Nginx或者Apache上部署的功能可以前移到負載均衡設備上,例如客戶請求中的Header重寫,伺服器響應中的關鍵字過濾或者內容插入等功能。

另外一個常常被提到功能就是安全性。網路中最常見的SYN Flood攻擊,即黑客控制眾多源客戶端,使用虛假IP地址對同一目標發送SYN攻擊,通常這種攻擊會大量發送SYN報文,耗盡伺服器上的相關資源,以達到Denial of Service(DoS)的目的。從技術原理上也可以看出,四層模式下這些SYN攻擊都會被轉發到後端的伺服器上;而七層模式下這些SYN攻擊自然在負載均衡設備上就截止,不會影響後台伺服器的正常運營。另外負載均衡設備可以在七層層面設定多種策略,過濾特定報文,例如SQLInjection等應用層面的特定攻擊手段,從應用層面進一步提高系統整體安全。

現在的7層負載均衡,主要還是著重於應用HTTP協議,所以其應用範圍主要是眾多的網站或者內部信息平台等基於B/S開發的系統。 4層負載均衡則對應其他TCP應用,例如基於C/S開發的ERP等系統。

常見的負載均衡演算法

隨機演算法:Random隨機,按權重設置隨機概率。在一個截面上碰撞的概率高,但調用量越大分布越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

輪詢及加權輪詢:輪詢(Round Robbin)當伺服器群中各伺服器的處理能力相同時,且每筆業務處理量差異不大時,最適合使用這種演算法。 輪循,按公約後的權重設置輪循比率。存在慢的提供者累積請求問題,比如:第二台機器很慢,但沒掛,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。加權輪詢(Weighted Round Robbin)為輪詢中的每台伺服器附加一定權重的演算法。比如伺服器1權重1,伺服器2權重2,伺服器3權重3,則順序為1-2-2-3-3-3-1-2-2-3-3-3- ......

最小連接及加權最小連接:最少連接(Least Connections)在多個伺服器中,與處理連接數(會話數)最少的伺服器進行通信的演算法。即使在每台伺服器處理能力各不相同,每筆業務處理量也不相同的情況下,也能夠在一定程度上降低伺服器的負載。加權最少連接(Weighted Least Connection)為最少連接演算法中的每台伺服器附加權重的演算法,該演算法事先為每台伺服器分配處理連接的數量,並將客戶端請求轉至連接數最少的伺服器上。

哈希演算法:普通哈希,一致性Hash,相同參數的請求總是發到同一提供者。當某一台提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。實現方式主要有:IP地址散列,通過管理髮送方IP和目的地IP地址的散列,將來自同一發送方的分組(或發送至同一目的地的分組)統一轉發到相同伺服器的演算法。當客戶端有一系列業務需要處理而必須和一個伺服器反覆通信時,該演算法能夠以流(會話)為單位,保證來自相同客戶端的通信能夠一直在同一伺服器中進行處理。URL散列,通過管理客戶端請求URL信息的散列,將發送至相同URL的請求轉發至同一伺服器的演算法。

響應速度均衡(Response Time):負載均衡設備對內部各伺服器發出一個探測請求(例如Ping),然後根據內部中各伺服器對探測請求的最快響應時間來決定哪一台伺服器來響應客戶端的服務請求。此種均衡演算法能較好的反映伺服器的當前運行狀態,但這最快響應時間僅僅指的是負載均衡設備與伺服器間的最快響應時間,而不是客戶端與伺服器間的最快響應時間。

最少連接數均衡(Least Connection):客戶端的每一次請求服務在伺服器停留的時間可能會有較大的差異,隨著工作時間加長,如果採用簡單的輪循或隨機均衡演算法,每一台伺服器上的連接進程可能會產生極大的不同,並沒有達到真正的負載均衡。最少連接數均衡演算法對內部中需負載的每一台伺服器都有一個數據記錄,記錄當前該伺服器正在處理的連接數量,當有新的服務連接請求時,將把當前請求分配給連接數最少的伺服器,使均衡更加符合實際情況,負載更加均衡。此種均衡演算法適合長時處理的請求服務,如FTP。

處理能力均衡:此種均衡演算法將把服務請求分配給內部中處理負荷(根據伺服器CPU型號、CPU數量、內存大小及當前連接數等換算而成)最輕的伺服器,由於考慮到了內部伺服器的處理能力及當前網路運行狀況,所以此種均衡演算法相對來說更加精確,尤其適合運用到第七層(應用層)負載均衡的情況下。

DNS響應均衡(Flash DNS):在Internet上,無論是HTTP、FTP或是其它的服務請求,客戶端一般都是通過域名解析來找到伺服器確切的IP地址的。在此均衡演算法下,分處在不同地理位置的負載均衡設備收到同一個客戶端的域名解析請求,並在同一時間內把此域名解析成各自相對應伺服器的IP地址(即與此負載均衡設備在同一位地理位置的伺服器的IP地址)並返回給客戶端,則客戶端將以最先收到的域名解析IP地址來繼續請求服務,而忽略其它的IP地址響應。在種均衡策略適合應用在全局負載均衡的情況下,對本地負載均衡是沒有意義的。

常見的負載均衡實現

DNS域名解析負載均衡

每次域名解析請求都會根據負載均衡演算法計算一個不同的IP地址返回,這樣A記錄中配置的多個伺服器就構成一個集群,並可以實現負載均衡。

DNS域名解析負載均衡的優點是將負載均衡工作交給DNS,省略掉了網路管理的麻煩,缺點就是DNS可能緩存A記錄,不受網站控制。事實上,大型網站總是部分使用DNS域名解析,作為第一級負載均衡手段,然後再在內部做第二級負載均衡。

數據鏈路層負載均衡

數據鏈路層負載均衡是指在通信協議的數據鏈路層修改mac地址進行負載均衡。

這種數據傳輸方式又稱作三角傳輸模式,負載均衡數據分發過程中不修改IP地址,只修改目的的mac地址,通過配置真實物理伺服器集群所有機器虛擬IP和負載均衡伺服器IP地址一樣,從而達到負載均衡,這種負載均衡方式又稱為直接路由方式(DR).

在下圖中,用戶請求到達負載均衡伺服器後,負載均衡伺服器將請求數據的目的mac地址修改為真是WEB伺服器的mac地址,並不修改數據包目標IP地址,因此數據可以正常到達目標WEB伺服器,該伺服器在處理完數據後可以經過網管伺服器而不是負載均衡伺服器直接到達用戶瀏覽器。

使用三角傳輸模式的鏈路層負載均衡是目前大型網站所使用的最廣的一種負載均衡手段。在linux平台上最好的鏈路層負載均衡開源產品是LVS(linux virtual server)。

IP負載均衡

IP負載均衡:即在網路層通過修改請求目標地址進行負載均衡。

用戶請求數據包到達負載均衡伺服器後,負載均衡伺服器在操作系統內核進行獲取網路數據包,根據負載均衡演算法計算得到一台真實的WEB伺服器地址,然後將數據包的IP地址修改為真實的WEB伺服器地址,不需要通過用戶進程處理。真實的WEB伺服器處理完畢後,相應數據包回到負載均衡伺服器,負載均衡伺服器再將數據包源地址修改為自身的IP地址發送給用戶瀏覽器。

這裡的關鍵在於真實WEB伺服器相應數據包如何返回給負載均衡伺服器,一種是負載均衡伺服器在修改目的IP地址的同時修改源地址,將數據包源地址改為自身的IP,即源地址轉換(SNAT),另一種方案是將負載均衡伺服器同時作為真實物理伺服器的網關伺服器,這樣所有的數據都會到達負載均衡伺服器。

IP負載均衡在內核進程完成數據分發,較反向代理均衡有更好的處理性能。但由於所有請求響應的數據包都需要經過負載均衡伺服器,因此負載均衡的網卡帶寬成為系統的瓶頸。

HTTP重定向負載均衡

HTTP重定向伺服器是一台普通的應用伺服器,其唯一的功能就是根據用戶的HTTP請求計算一台真實的伺服器地址,並將真實的伺服器地址寫入HTTP重定向響應中(響應狀態嗎302)返回給瀏覽器,然後瀏覽器再自動請求真實的伺服器。

這種負載均衡方案的優點是比較簡單,缺點是瀏覽器需要每次請求兩次伺服器才能拿完成一次訪問,性能較差;使用HTTP302響應碼重定向,可能是搜索引擎判斷為SEO作弊,降低搜索排名。重定向伺服器自身的處理能力有可能成為瓶頸。因此這種方案在實際使用中並不見多。

反向代理負載均衡

傳統代理伺服器位於瀏覽器一端,代理瀏覽器將HTTP請求發送到互聯網上。而反向代理伺服器則位於網站機房一側,代理網站web伺服器接收http請求。

反向代理的作用是保護網站安全,所有互聯網的請求都必須經過代理伺服器,相當於在web伺服器和可能的網路攻擊之間建立了一個屏障。

除此之外,代理伺服器也可以配置緩存加速web請求。當用戶第一次訪問靜態內容的時候,靜態內存就被緩存在反向代理伺服器上,這樣當其他用戶訪問該靜態內容時,就可以直接從反向代理伺服器返回,加速web請求響應速度,減輕web伺服器負載壓力。

另外,反向代理伺服器也可以實現負載均衡的功能。由於反向代理伺服器轉發請求在HTTP協議層面,因此也叫應用層負載均衡。優點是部署簡單,缺點是可能成為系統的瓶頸。

常用的負載均衡健康檢查機制

儘管有多種的負載均衡演算法可以較好的把數據流量分配給伺服器去負載,但如果負載均衡策略沒有對網路系統狀況的檢測方式和能力,一旦在某台伺服器或某段負載均衡設備與伺服器網路間出現故障的情況下,負載均衡設備依然把一部分數據流量引向那台伺服器,這勢必造成大量的服務請求被丟失,達不到不間斷可用性的要求。所以良好的負載均衡策略應有對網路故障、伺服器系統故障、應用服務故障的檢測方式和能力:

Ping偵測:通過ping的方式檢測伺服器及網路系統狀況,此種方式簡單快速,但只能大致檢測出網路及伺服器上的操作系統是否正常,對伺服器上的應用服務檢測就無能為力了。

TCP Open偵測:每個服務都會開放某個通過TCP連接,檢測伺服器上某個TCP埠(如Telnet的23口,HTTP的80口等)是否開放來判斷服務是否正常。

HTTP URL偵測:比如向HTTP伺服器發出一個對main.html文件的訪問請求,如果收到錯誤信息,則認為伺服器出現故障。

負載均衡實施要素

負載均衡方案應是在網站建設初期就應考慮的問題,不過有時隨著訪問流量的爆炸性增長,超出決策者的意料,這也就成為不得不面對的問題。當我們在引入某種負載均衡方案乃至具體實施時,像其他的許多方案一樣,首先是確定當前及將來的應用需求,然後在代價與收效之間做出權衡。

針對當前及將來的應用需求,分析網路瓶頸的不同所在,我們就需要確立是採用哪一類的負載均衡技術,採用什麼樣的均衡策略,在可用性、兼容性、安全性等等方面要滿足多大的需求,如此等等。

不管負載均衡方案是採用花費較少的軟體方式,還是購買代價高昂在性能功能上更強的第四層交換機、負載均衡器等硬體方式來實現,亦或其他種類不同的均衡技術,下面這幾項都是我們在引入均衡方案時可能要考慮的問題:

性能:性能是我們在引入均衡方案時需要重點考慮的問題,但也是一個最難把握的問題。衡量性能時可將每秒鐘通過網路的數據包數目做為一個參數,另一個參數是均衡方案中伺服器群所能處理的最大並發連接數目,但是,假設一個均衡系統能處理百萬計的並發連接數,可是卻只能以每秒2個包的速率轉發,這顯然是沒有任何作用的。性能的優劣與負載均衡設備的處理能力、採用的均衡策略息息相關,並且有兩點需要注意:一、均衡方案對伺服器群整體的性能,這是響應客戶端連接請求速度的關鍵;二、負載均衡設備自身的性能,避免有大量連接請求時自身性能不足而成為服務瓶頸。有時我們也可以考慮採用混合型負載均衡策略來提升伺服器群的總體性能,如DNS負載均衡與NAT負載均衡相結合。另外,針對有大量靜態文檔請求的站點,也可以考慮採用高速緩存技術,相對來說更節省費用,更能提高響應性能;對有大量ssl/xml內容傳輸的站點,更應考慮採用ssl/xml加速技術。

可擴展性:IT技術日新月異,一年以前最新的產品,現在或許已是網路中性能最低的產品;業務量的急速上升,一年前的網路,現在需要新一輪的擴展。合適的均衡解決方案應能滿足這些需求,能均衡不同操作系統和硬體平台之間的負載,能均衡HTTP、郵件、新聞、代理、資料庫、防火牆和 Cache等不同伺服器的負載,並且能以對客戶端完全透明的方式動態增加或刪除某些資源。

靈活性:均衡解決方案應能靈活地提供不同的應用需求,滿足應用需求的不斷變化。在不同的伺服器群有不同的應用需求時,應有多樣的均衡策略提供更廣泛的選擇。

可靠性:在對服務質量要求較高的站點,負載均衡解決方案應能為伺服器群提供完全的容錯性和高可用性。但在負載均衡設備自身出現故障時,應該有良好的冗餘解決方案,提高可靠性。使用冗餘時,處於同一個冗餘單元的多個負載均衡設備必須具有有效的方式以便互相進行監控,保護系統儘可能地避免遭受到重大故障的損失。

易管理性:不管是通過軟體還是硬體方式的均衡解決方案,我們都希望它有靈活、直觀和安全的管理方式,這樣便於安裝、配置、維護和監控,提高工作效率,避免差錯。在硬體負載均衡設備上,目前主要有三種管理方式可供選擇:一、命令行介面(CLI:Command Line Interface),可通過超級終端連接負載均衡設備串列介面來管理,也能telnet遠程登錄管理,在初始化配置時,往往要用到前者;二、圖形用戶介面(GUI:Graphical User Interfaces),有基於普通web頁的管理,也有通過Java Applet 進行安全管理,一般都需要管理端安裝有某個版本的瀏覽器;三、SNMP(Simple Network Management Protocol,簡單網路管理協議)支持,通過第三方網路管理軟體對符合SNMP標準的設備進行管理。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 一程一序 的精彩文章:

TAG:一程一序 |