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

 

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://virtualadc.blog.51cto.com/3027116/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): 將客戶端的源地址,端口進行哈希運算,根據運算的結果轉發給一臺服務器進行處理,當其中某個服務器發生故障,就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
Ø 基於策略的負載均衡:針對不同的數據流設置導向規則,用戶可自行編輯流量分配策略,利用這些策略對通過的數據流實施導向控制。
Ø 基於數據包的內容分發:例如判斷HTTP的URL,如果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).
 
本文出自 “ADC技術博客” 博客,請務必保留此出處http://virtualadc.blog.51cto.com/3027116/615836
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章