李燕清
(湖南建筑高級技工學校湖南長沙410015)
淺析LVS集群的動態負載均衡方法
李燕清
(湖南建筑高級技工學校湖南長沙410015)
為了解決服務器負載過重的問題,最常見的方法是提高服務器的硬件性能,如提高CPU頻率和總線帶寬、增加CPU數量和內存容量等,這些措施導致服務器價格昂貴、擴展性差,而且這種提升也受當時技術水平的限制。集群技術在現有設備和網絡之上構建,是一種高效解決服務器負載過重和提高性能的方案,將多臺服務器通過高速網絡互連成1個集合,集合中的每臺服務器地位相同,都能為客戶的訪問提供服務。服務器采用虛擬IP(Virtual IP,VIP),客戶端程序與集群系統交互時,就像在與1臺高性能服務器進行交互。
負載均衡是將任務均衡地分配到多個系統上執行,從而共同完成任務。它通過有效的方法擴展服務器的帶寬和數據處理能力,提高網絡的可用性、靈活性和吞吐率。
負載均衡的主要含義:①將大量并發網絡連接或數據流量按照一定的策略分配到不同服務器上執行,可增大集群系統吞吐量,縮短響應時間;②將復雜計算按照某種策略分配給多個節點并行執行,計算結束后將多個節點的處理結果匯總并返回給用戶。
隨著網絡流量的爆發式增長,僅僅依靠高性能集群并不能確保系統吞吐率高和響應用戶請求速度快。整個集群系統必須像1臺服務器統一對外提供服務,需要采用負載均衡技術來高效地分配各種用戶請求。
服務器集群能很大程度上提高服務質量,有效緩解網絡堵塞,縮短服務器的響應時間。基于Linux的虛擬服務器(Linux Virtual Service,簡稱LVS),由于其軟件開源且性能穩定,獲得了非常廣泛的應用。但在負載均衡策略方面還存在不足,現有的調度策略不能完全根據服務器的實時情況動態分配負載。本文分析了3種流行的集群系統負載均衡技術,并比較了它們的優缺點。
3.1 LVS結構
負載均衡器能將請求均勻地分配給不同服務器,而且還可以屏蔽故障節點。LVS集群系統運用IP負載均衡技術和基于內容請求的分發技術,因此,在設計時應充分考慮集群的可伸縮性、靈活性和高可用性。LVS集群通常由負載均衡器、服務器池和共享存儲構成。
(1)負載均衡器(Load Balance):它位于LVS集群的最前端,是用戶訪問集群系統的唯一入口,負責將客戶端請求分配到服務器上執行,在用戶看來,同一項服務來自同一個IP地址。這些操作由Linux內核完成,調度消耗的資源較少,因此有很高的吞吐率。為了保證系統的健壯性,通常會給負載均衡器增加1個備份,兩者通過心跳線連接。
(2)服務器池(Server Pool):真正處理用戶網絡請求的服務器集合,執行Web,Ftp,Mail等網絡服務。池中服務器數量動態可變,如果集群系統負載過重,可增加服務器來滿足增長的負載需求。理論上,隨著池中服務器數量的增加,集群系統的性能也可線性增長。
(3)共享存儲(Shared Storage):由數據庫、分布式文件或網絡文件系統構成,它給服務器池提供1個共享的存儲區。由于磁盤陣列和分布式文件系統價格昂貴,小型網絡應用如果對數據一致性要求不高,可將數據存儲在服務器本地硬盤中。
這三者之間通過高速LAN或者WAN相互連接,使用高速LAN可以避免集群系統擴大升級時網絡成為整個集群系統的瓶頸。
在Linux內核中,通過修改TCP/IP協議棧,對IP報文進行改寫和轉發。IPVS軟件實現基于IP層的3種負載均衡技術,同時還提供ipvsadm程序進行虛擬服務器的配置與管理。
IPVS由調度算法、IP包處理、虛擬服務器與真實服務器鏈表、配置與管理等4個模塊組成。
集群系統啟動時,負載均衡器對IPVS進行初始化,IPVS 通過setsockopt()和getsockopt()2個函數進行注冊與相關配置。主要的配置管理文件存儲在ip_vs_ctl.c中,當管理員調用setsockopt()函數時,系統就會自動運行ip_vs_ctl.c文件中的do_ip_vs_set_ctl()函數中的內容,完成服務器的添加、修改和刪除等操作。服務器和虛擬服務器的添加、修改和刪除操作分別由函數ip_vs_add_dest()、ip_vs_edit_dest()和ip_vs_edit_server()完成。
3.2 LVS的IP負載均衡技術
VS/NAT(Virtual Server via Network Address Translation)技術是通過網絡地址轉換將一組服務器組成一個高可用、高性能的虛擬服務器集群系統。通過分析請求報文和響應報文的非對稱特點以及VS/NAT技術存在的不足,一些文獻提出了通過IP隧道實現虛擬服務器VS/TUN(Virtual Server via IP Tunneling)和通過直接路由實現虛擬服務器VS/DR(Virtual Server via Direct Routing)等方法。
3.2.1 基于NAT技術
因為IPv4的IP地址空間有限以及網絡安全問題,一些網絡采用預留IP地址。當網絡內部的計算機與因特網進行信息交換時,需要通過NAT將內部IP地址轉換為外部IP地址。VS/NAT模式將負載均衡器置于集群系統前端,通過高速交換機連接服務器,外部用戶請求被分配給任意服務器處理,其結果是相同的。VS/NAT結構示意如圖1所示。

圖1 VS/NAT結構示意
客戶端通過VIP訪問集群時,負載均衡器首先收到請求報文,并按照一定的策略從后端服務器池中選出1臺服務器,將報文的VIP和端口改成該服務器的地址和端口,再將報文轉發給該服務器;同時在哈希表中記載這個連接,當相同網絡連接的下一個報文到達時,進行同樣的改寫與轉發操作。真實服務器將響應報文發送給負載均衡器時,負載均衡器將報文的源地址和端口做相應的改寫,再將響應報文發送給用戶。
3.2.2 基于IP隧道技術
負載均衡器收到客戶端的請求報文后,利用IP隧道技術封裝請求報文并轉發給按調度策略動態選出的服務器,該服務器根據路由表將響應報文直接返回給用戶。因為服務器池中有多個節點,所以不能建立靜態的一對一隧道。
VS/TUN模式處理數據包流程如圖2所示。該模式與NAT模式的連接調度和管理方法相同,兩者的差異在于報文的轉發方式上。負載均衡器根據服務器的實時負載,從服務器池中動態地選擇1臺服務器,將封裝后的IP報文發給該服務器;服務器收到報文并處理該報文,然后將響應報文直接發送給用戶。
3.2.3 基于直接路由技術
在VS/DR模式中,負載均衡器只負責分配用戶的請求,由服務器負責處理請求并將響應報文返回給客戶,這樣提高了LVS集群系統的吞吐率。VS/DR模式的負載均衡器與服務器池中的各個服務器通過高速交換機相互連接。VIP為整個集群系統共同享有,負載均衡器配置的VIP對用戶完全透明,主要用于接收網絡請求;而服務器配置的VIP對用戶是不可見的,只用于處理目標地址為VIP的網絡請求。

圖2 VS/TUN模式處理數據包流程
負載均衡器只需將數據幀的MAC地址修改為被選服務器的MAC地址,并轉送給被選服務器。服務器處理完后,再根據路由表直接將響應報文發送給用戶。在此點上,VS/DR和VS/TUN的方式不同。
3.3 3種負載均衡策略分析
LVS的3種IP負載均衡技術比較見表3。

表1 LVS的3種IP負載均衡技術比較
從表1可以看出,這3種負載均衡策略都有各自的特點。
負載均衡算法主要分為靜態和動態兩大類,Linux下的IPVS負載均衡算法以連接數為粒度,這種負載均衡在某種程度上能減少負載傾斜現象的發生。目前,已有超過十余種負載均衡調度算法,每種調度算法均被實現為1個內核模塊,在需要時加載。
4.1 靜態算法
靜態算法主要有輪動類和地址散列類。輪動(Round Robin,RR)算法是按照一定的順序將連接請求分配給不同的服務器,其最大優點是簡潔,但沒有考慮服務器的差異以及當前活躍連接數。當服務器的性能差別較大或者請求服務時間波動較大時,系統容易出現負載傾斜現象。加權輪動(Weighted Round- Robin,WRR)依據服務器的性能分配權重,根據權重和輪動策略分配請求到服務器。WRR在一定的環境下效果不錯,但是當服務時間波動較大時,系統依然會出現負載傾斜現象。
地址散列算法主要有目的地址散列算法(Destination Hashing,DH)和源地址散列算法(Source Hashing,SH),分別將目的或源IP地址映射到池中的某臺服務器上,顯然這2個算法都未依據實時情況分配連接。
4.2 動態算法
動態算法以最小連接(Least Connection,LC)算法為代表,該算法把新的連接分配給當前活躍連接數最小的服務器,負載均衡器根據各服務器的活躍連接數來衡量實時負載情況。服務器性能相同時,LC算法能把服務時間波動較大的請求均勻分配給不同服務器,從而避免負載傾斜的出現。
但是,當服務器的性能差異較大時,容易引發負載不均衡。加權最小連接算法(Weighted Least Connection,WLC)通過給不同性能的服務器設置權重,盡量使服務器的當前活躍連接數和它的權重成比例,算法將新的連接請求分配給比值(當前活躍連接數/權重)最小的服務器。該算法綜合考慮了服務器的性能和當前連接數,是IPVS默認的負載均衡調度算法。
動態算法還有基于局部性的最少鏈接(Locality Based Least Connections,LBLC)、帶復制的基于局部性最少鏈接(Locality Based Least Connections with Replication,LBLCR)、最短預期延時(Shortest Expected Delay,SED)和不排隊調度(Never Queue Scheduling,NQ)等算法,多數都是基于LC算法的改進版。
LVS集群作為一種優秀的負載均衡技術,已經在許多領域得到了大規模的應用。然而,LVS集群存在一定的局限性,在LVS集群運行一段時間后,集群容易出現負載傾斜現象。如果想要在不增加硬件投入的前提下提高集群系統的穩定性和可靠性,還需在負載均衡算法上做些工作,比如WLC算法可采取動態修改服務器權重,對于改善集群性能、減少負載傾斜的發生是很有意義的。
2016- 12- 01)