服務器負載均衡的基本功能和實現原理


轉自:http://blog.51cto.com/virtualadc/615836

負載均衡設備作為縱跨網絡2-7層協議的設備,往往放置在網絡設備和應用設備的連接處,對工程師在網絡和應用基本知識方面的要求遠高於其他設備,所以我們要在基本功能的理解上下更多的功夫。負載均衡設備還有另外一個稱呼:4/7層交換機,但它首先是個2-3層交換機,這要求我們首先掌握2-3層的基本知識,然后才是本文介紹的內容。

服務器負載均衡有三大基本Feature:負載均衡算法,健康檢查和會話保持,這三個Feature是保證負載均衡正常工作的基本要素。其他一些功能都是在這三個功能之上的一些深化。下面我們具體介紹一下各個功能的作用和原理。

在沒有部署負載均衡設備之前,用戶直接訪問服務器地址(中間或許有在防火牆上將服務器地址映射成別的地址,但本質上還是一對一的訪問)。當單台服務器由於性能不足無法處理眾多用戶的訪問時,就要考慮用多台服務器來提供服務,實現的方式就是負載均衡。負載均衡設備的實現原理是把多台服務器的地址映射成一個對外的服務IP(我們通常稱之為VIP,關於服務器的映射可以直接將服務器IP映射成VIP地址,也可以將服務器IP:Port映射成VIP:Port,不同的映射方式會采取相應的健康檢查,在端口映射時,服務器端口與VIP端口可以不相同),這個過程對用戶端是透明的,用戶實際上不知道服務器是做了負載均衡的,因為他們訪問的還是一個目的IP,那么用戶的訪問到達負載均衡設備后,如何把用戶的訪問分發到合適的服務器就是負載均衡設備要做的工作了,具體來說用到的就是上述的三大Feature。

我們來做一個詳細的訪問流程分析:

 

 

 

 

用戶(IP:207.17.117.20)訪問域名www.a10networks.com,首先會通過DNS查詢解析出這個域名的公網地址:199.237.202.124,接下來用戶207.17.117.20會訪問199.237.202.124這個地址,因此數據包會到達負載均衡設備,接下來負載均衡設備會把數據包分發到合適的服務器,看下圖:

 

 

 

負載均衡設備在將數據包發給服務器時,數據包是做了一些變化的,如上圖所示,數據包到達負載均衡設備之前,源地址是:207.17.117.20,目的地址是:199.237.202.124, 當負載均衡設備將數據包轉發給選中的服務器時,源地址還是:207.17.117.20,目的地址變為172.16.20.1,我們稱這種方式為目的地址NAT(DNAT)。一般來說,在服務器負載均衡中DNAT是一定要做的(還有另一種模式叫做服務器直接返回-DSR,是不做DNAT的,我們將另行討論),而源地址根據部署模式的不同,有時候也需要轉換成別的地址,我們稱之為:源地址NAT(SNAT),一般來說,旁路模式需要做SNAT,而串接模式不需要,本示意圖為串接模式,所以源地址沒做NAT。

我們再看服務器的返回包,如下圖所示,也經過了IP地址的轉換過程,不過應答包中源/目的地址與請求包正好對調,從服務器回來的包源地址為172.16.20.1,目的地址為207.17.117.20,到達負載均衡設備后,負載均衡設備將源地址改為199.237.202.124,然后轉發給用戶,保證了訪問的一致性。

 

 

 

 

以上是單個數據包的處理流程。那么負載均衡設備是怎么選擇服務器的呢? 這就是我們要介紹的第一個Feature:

 

負載均衡算法

 

一般來說負載均衡設備都會默認支持多種負載均衡分發策略,例如:

  • 輪詢(RoundRobin)將請求順序循環地發到每個服務器。當其中某個服務器發生故障,AX就把其從順序循環隊列中拿出,不參加下一次的輪詢,直到其恢復正常。
  • 比率(Ratio):給每個服務器分配一個加權值為比例,根椐這個比例,把用戶的請求分配到每個服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
  • 優先權(Priority):給所有服務器分組,給每個組定義優先權,將用戶的請求分配給優先級最高的服務器組(在同一組內,采用預先設定的輪詢或比率算法,分配用戶的請求);當最高優先級中所有服務器或者指定數量的服務器出現故障,AX將把請求送給次優先級的服務器組。這種方式,實際為用戶提供一種熱備份的方式。
  • 最少連接數(LeastConnection):AX會記錄當前每台服務器或者服務端口上的連接數,新的連接將傳遞給連接數最少的服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
  • 最快響應時間(Fast Reponse time):新的連接傳遞給那些響應最快的服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。

以上為通用的負載均衡算法,還有一些算法根據不同的需求也可能會用到,例如:

  • 哈希算法( hash):  將客戶端的源地址,端口進行哈希運算,根據運算的結果轉發給一台服務器進行處理,當其中某個服務器發生故障,就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
  • 基於策略的負載均衡:針對不同的數據流設置導向規則,用戶可自行編輯流量分配策略,利用這些策略對通過的數據流實施導向控制。
  • 基於數據包的內容分發:例如判斷HTTPURL,如果URL中帶有.jpg的擴展名,就把數據包轉發到指定的服務器。

 

繼續看圖分析,第二個用戶207.17.117.21也訪問www.a10networks.com,負載均衡設備根據負載均衡算法將第二個用戶的請求轉發到第二台服務器來處理。

 

 

 

 

 

 

 

假設在工作過程中,突然有一台服務器出現問題怎么辦? 這就涉及到我們要介紹的第二個Feature:

健康檢查

健康檢查用於檢查服務器開放的各種服務的可用狀態。負載均衡設備一般會配置各種健康檢查方法,例如Ping,TCP,UDP,HTTP,FTP,DNS等。Ping屬於第三層的健康檢查,用於檢查服務器IP的連通性,而TCP/UDP屬於第四層的健康檢查,用於檢查服務端口的UP/DOWN,如果要檢查的更准確,就要用到基於7層的健康檢查,例如創建一個HTTP健康檢查,Get一個頁面回來,並且檢查頁面內容是否包含一個指定的字符串,如果包含,則服務是UP的,如果不包含或者取不回頁面,就認為該服務器的Web服務是不可用(DOWN)的。如下圖所示,負載均衡設備檢查到172.16.20.3這台服務器的80端口是DOWN的,負載均衡設備將不把后面的連接轉發到這台服務器,而是根據算法將數據包轉發到別的服務器。創建健康檢查時可以設定檢查的間隔時間和嘗試次數,例如設定間隔時間為5秒,嘗試次數為3,那么負載均衡設備每隔5秒發起一次健康檢查,如果檢查失敗,則嘗試3次,如果3次都檢查失敗,則把該服務標記為DOWN,然后服務器仍然會每隔5秒對DOWN的服務器進行檢查,當某個時刻發現該服務器健康檢查又成功了,則把該服務器重新標記為UP。健康檢查的間隔時間和嘗試次數要根據綜合情況來設置,原則是既不會對業務產生影響,又不會對負載均衡設備造成較大負擔。

 

 

 

 

 

假設是同一個用戶繼續訪問,后續的連接會怎么處理呢? 看下圖:

 

 

用戶207.17.117.25之前發起的第一個連接是207.17.117.25:4003-〉199.237.202.127:80,負載均衡設備將該連接轉發到了172.16.20.4,接着發起第二個連接207.17.117.25:4004-〉199.237.202.127:80,我們看到該連接還是轉發到了服務器172.16.20.4,為什么呢?因為負載均衡設備配置了會話保持。

會話保持

會話保持用於保持會話的連續性和一致性,由於服務器之間很難做到實時同步用戶訪問信息,這就要求把用戶的前后訪問會話保持到一台服務器上來處理。舉個例子,用戶訪問一個電子商務網站,如果用戶登錄時是由第一台服務器來處理的,但用戶購買商品的動作卻由第二台服務器來處理,第二台服務器由於不知道用戶信息,所以本次購買就不會成功。這種情況就需要會話保持,把用戶的操作都通過第一台服務器來處理才能成功。當然並不是所有的訪問都需要會話保持,例如服務器提供的是靜態頁面比如網站的新聞頻道,各台服務器都有相同的內容,這種訪問就不需要會話保持。

負載均衡設備一般會默認配置一些會話保持的選項,例如源地址的會話保持,Cookie會話保持等,基於不同的應用要配置不同的會話保持,否則會引起負載的不均衡甚至訪問異常。具體可參考本人的另一篇拙作:《不同應用環境下會話保持方式的選擇》。

本文介紹了負載均衡的基本功能和實現原理,看起來並不難,但負載均衡涉及的知識其實非常的廣泛,根據各個用戶系統的不同,我們要熟悉不同的協議和應用流程,甚至涉及到某些開發語言和軟件平台,否則在出現故障的時候,我們可能沒有能力做出有效的判斷,從這個意義上來說,一個負載均衡設備的工程師要掌握網絡,應用和系統等各方面的知識,這些都要當作基礎來積累。

(wyl).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM