摘要:該文首先簡要介紹了現有的基于LVS的服務器集群的結構和現有負載均衡方法,然后針對現有服務器集群負載均衡算法的不足,提出一種新的動態反饋機制負載均衡方法,該方法在考慮CUP占用率、內存使用率和各節點的響應時間的前提下,動態反饋獲取個服務器的負載量,達到負載均衡的目的。
關鍵詞:集群;負載均衡;LVS;動態反饋
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2010)21-5754-03
隨著計算機的快速發展,系統的訪問量和用戶量飛速增長、業務量以及用戶需求的多樣化使得業務邏輯和事務的處理日益復雜,這必然給服務器性能帶來巨大的挑戰。傳統的方法就是對服務器進行軟、硬件升級,如更換容量更大、處理速度更快的服務器等,但是
由于單臺服務器的性能總是有限的,簡單的提高硬件性能并不能真正解決這個問題。在這種情況下,利用集群技術[1]在服務器應用系統中實現負載均衡是解決上述問題的有效方法。負載均衡技術[2]作為集群系統的核心技術之一,本文重點闡述了Linux虛擬服務器[3],Linux虛擬服務器使用負載均衡技術將多臺服務器組成一個虛擬服務器。它為適應快速增長的網絡訪問需求提供了一個負載能力易于擴展,而價格低廉的解決方案。
1 LVS系統的介紹
Linux Virtual Server:簡稱LVS[4-6]。是由中國一個Linux程序員章文嵩博士發起和領導的,基Linux系統的服務器集群解決方案,其實現目標是創建一個具有良好的擴展性、高可靠性、高性能和高可用性的體系。許多商業的集群產品,比RedHat的Piranha、 Turbo Linux公司的Turbo Cluster等,都是基于LVS的核心代碼的。體系結構:使用LVS架設的服務器集群系統從體系結構上看是透明的,最終用戶只感覺到一個虛擬服務器。物理服務器之間可以通過高速的 LAN或分布在各地的WAN相連。最前端是負載均衡器,它負責將各種服務請求分發給后面的物理服務器,讓整個集群表現得像一個服務于同一IP地址的虛擬服務器。
工作原理:LVS由前端的負載均衡器(LoadBalancer,LB)和后端的真實服務器(Real Server,RS)群組成。RS間可通過局域網或廣域網連接。LVS的這種結構對用戶是透明的,用戶只能看見一臺作為LB的虛擬服務器(Virtual Server),而看不到提供服務的RS群。 當用戶的請求發往虛擬服務器,LB根據設定的包轉發策略和負載均衡調度算法將用戶請求轉發給RS。RS再將用戶請求結果返回給用戶。同請求包一樣,應答包的返回方式也與包轉發策略有關。
LVS的體系結構如圖1所示,它主要由以下三部分組成。
負載均衡器(Load Balancer):它是整個集群對外的前端機,它負責將客戶的服務請求發送到一組真實服務器上執行,而客戶則認為服務是來自同一個IP地址上的。
服務器池(ServerPool):客戶端發出的服務請求經過負載均衡器處理以后轉交到服務池,服務器池由響應服務的真實服務器組成,每一個真實服務器又稱為一個服務節點,服務節點響應服務請求并返回數據。
后端存儲(BackendStorage):為服務器池提供一個共享的存儲區,這樣很容易使各服務器提供相同的服務。
2 LVS 的IP 負載均衡
LVS的實現基礎是IP交換,也就是接入協議交換技術,但LVS的體系結構具備一定的可擴展性,可以實現高性能、高可擴展性、易管理性等諸多特點,成為一個以負載均衡為核心的真正意義的集群系統。IP負載均衡技術是在負載調度器的實現技術中效率最高的。
現在的LVS集群采用IP負載均衡技術有以下三種模式下:
1) 通過NAT實現虛擬服務器(VS/NAT)
通過網絡地址轉換,調度器重寫請求提出報文的目標地址,根據預設的高度算法,將請求分派給后端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。
2) 通過IP 隧道實現虛擬服務器(VS/TUN)
隧道模式則類似于VPN的方式,使用網絡分層的原理,在從客戶端發來的數據包的基礎上,封裝一個新的IP頭標記(不完整的IP頭,只有目的IP部)發給REALSERVER,REALSERVER收到后,先把DR發過來的數據包的頭給解開,還原其數據包原樣,處理后,直接返回給客戶端,而不需要再經過DR。需要注意的是,由于REALSERVER需要對DR發過來的數據包進行還原,也就是說必須支持IPTUNNEL協議。所以,在REALSERVER的內核中,必須編譯支持IPTUNNEL這個選項。IPTUNNEL也在Net working options里面。
3) 通過直接路由實現虛擬服務器(VS/DR)
直接路由模式比較特別,很難說和什么方面相似,前2種模式基本上都是工作在網絡層上(三層),而直接路由模式則應該是工作在數據鏈路層上(二層)。其原理為,DR和REALSERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有REALSERVER對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包后根據調度算法,找出對應的REALSERVER,把目的MAC地址改為REALSERVER的MAC并發給這臺REALSERVER。這時REALSERVER收到這個數據包,則等于直接從客戶端收到這個數據包無異,處理后直接返回給客戶端。由于DR要對二層包頭進行改換,所以DR和REALSERVER之間必須在一個廣播域,也可以簡單的理解為在同一臺交換機上。
LVS系統的實現過程如下:
1) 客戶端通過Internet把用戶服務請求發向集群服務器系統;
2) 客戶請求到Load Balancer以后,讀取并解析用戶的請求,根據一定的負載均衡算法,選擇集群中合適的服務節點;
3) Load Balancer把客戶的請求包給選中的服務節點;
4) 服務節點處理客戶請求,并把結果返回Load Balancer;
5) Load Balancer將處理后的結果返回給請求服務的客戶;
6) 處理返回后的結果到達客戶端。
3 LVS現在的負載調度算法和改進思想
LVS軟件的核心是運行在LB上的IPVS,它使用基于IP層的負載均衡方法。IPVS的總體結構主要由IP包處理、負載均衡算法、系統配置與管理三個模塊及虛擬服務器與真實服務器鏈表組成。它的主要作用是:安裝在Load Balancer上,把發往Virtual IP的請求轉發到Real Server上,負載調度算法是整個服務器集群性能好壞的關鍵。
3.1 八種調度算法
針對不同的網絡服務需求和服務器配置,內核管理軟件IPVS為Load Balancer實現了如下八種負載調度算法:
1) 輪循算法輪詢(RR): 把新的連接請求按順序輪流分配到不同的服務器上,從而實現負載均衡,該算法最大的優點在于簡單易行,但不適用于每個服務器處理性能不一致的情況.
2) 加權輪循算法(WRR):加權輪循算法可以解決服務器間性能不一的情況,它用相應的權值表示服務器的處理性能,服務器的缺省權值為1。假設服務器A的權值為1,B的權值為2,則表示服務器B的處理性能是A的兩倍。加權輪叫調度算法是按權值的高低和輪叫方式分配請求到各服務器。權值高的服務器先收到的連接,權值高的服務器比權值低的服務器處理更多的連接,相同權值的服務器處理相同數目的連接數。
3) 目標地址散列調度算法(DHS):目標地址散列調度算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空
4) 源地址散列調度算法(SHS):源地址散列調度算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同。它的算法流程與目標地址散列調度算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址。
5) 最小連接調度算法(LCS):最小連接調度算法是把新的連接請求分配到當前連接數最小的服務器。最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中止或超時,其連接數減一。在系統實現時,也引入當服務器的權值為零時,表示該服務器不可用而不被調度。
6) 加權最小連接算法(WLC):加權最小連接調度算法是最小連接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值為1,系統管理員可以動態地設置服務器的權值。加權最小連接調度在調度新連接時盡可能使服務器的已建立連接數和其權值成比例。
7) 基于局部性的最小連接算法(LBLC):基于局部性的最小連接算法是針對請求報文的目標IP地址的負載均衡調度,目前主要用于Cache集群系統,因為在Cache集群中客戶請求報文的目標IP地址是變化的。這里假設任何后端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存Cache命中率,從而整個集群系統的處理能力。
8) 帶復制的基于局部性最少鏈接調度(LBLCR):根據請求的目標IP地址找出該目標IP地址對應的服務器組,按最小連接原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載則按最小連接數原則從整個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器%并定期將該集合中負載最大的服務器節點剔除。
上述八種調度策略屬于靜態調度算法,靜態分配算法簡單,設置方便,但是在實際應用中,由于各節點機的配置、瞬時網絡狀態、當前系統的連接數及用戶請求信息的不確定,很難只通過靜態負載均衡方案達到系統的負載均衡。
3.2 改進的動態反饋算法
針對以上八種算法不能很好的達到實時負載均衡的不足,本文提出了一種改進的動態反饋思想,即系統中LVS與系統中每一個服務器節點建立一個長期穩定的TCP連接,并使用一個單獨的線程與每一個服務器節點通信;各個服務器節點內駐留一個特殊的進程,該進程定期采集本機的性能參數和當前負載(CPU使用率、內存占有率、IO率、網絡帶寬使用率和服務器響應時間等),并將這些參數上傳至LVS。LVS獲取各服務器節點的負載情況,將各負載信息寫人本機的負載信息表中。然后根據各個服務器節點的負載量,按最小負載調度算法進行分配服務器請求,若某服務節點在規定時間內沒有應答信息返給LVS,則認為該節點失效。LVS將在自己的負載信息表中將該節點標記為不可用狀態,避免將下次客戶請求任務分給失效節點。
動態參數:各服務器節點的當前真實負載情況L取以下參數計算:CUP占用率Lcpu,內存使用率Lmem,各節點的響應時間Lt按照式以下公式(2)計算服務器節點的當前負載情況,集群的服務不同,各參數的影響也各不相同。
Lsi=K1*LCPU+K2*Lmem+K3*Lt
其中常量系數ki表示各個負載參數的重要程度, ki的值也是根據系統實際測試進行設置,以期達到最佳狀態,其中Σki =1。
4 結束語
本文介紹了基于LVS的服務器集群的結構和現有負載均衡方法,指出了現有負載均衡算法的其中的不足之處,并提出了一種新的平衡負載算法的改進思路。該方法在考慮CUP占用率、內存使用率和各節點的響應時間的前提下,動態收收集個服務器實時負載信息,達到最佳的服務器負載均衡的目的。
參考文獻:
[1] 戴剛.服務器集群關鍵技術的研究與實現:碩士學位論文[D].國防科學技術大學圖書館,2002.
[2] 李文正,郭芳,王利,等Internet服務器負載均衡的研究與實現[J].計算機工程,2005,3 1(6):98-99.
[3] Zhang Wengsong,Jin Shiyao,Wu Quanyuan.LinuxDirector:A Connection Director for ScalableInternetServices[J].JournalofComputerScienceandTechnology,2000,15(6):560-517.
[4] 章文嵩.Linux虛擬服務器工程[EB/OL].http://www.LinuxVirtualServer.org/2002.2-4.
[5] 章文嵩.Linux虛擬服務調度算法[EB/OL]. http://www.LinuxVirtualServer.org/html.2002.3-4.
[6] 章文嵩.Linux服務器集群系統(四)[EB/OL].http://www.900.ibmcom/developerWorks/cn/linux/cluster/lvs/part4/index.shtml:2002.2-4.
[7] 劉振英,張毅.多機系統的動態負載平衡.計算機科學,1999(26):38-40.
[8] 田紹亮,左明,吳紹偉. 一種改進的基于動態反饋的負載均衡算法[J].計算機工程與應用,2007,28(3).
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文