前面講的nginx負載均衡,是屬于網絡七層負載,今天講另外一種負載均衡技術LVS,它是基于網絡四層進行負載,性能很好,通常在大型項目中,我們會同時使用四層和七層負載。
一、LVS簡介
LVS是Linux Virtual Server的簡寫,意即Linux虛拟伺服器,是一個虛拟的伺服器叢集系統。本項目在1998年5月由章文嵩博士主導的開源負載均衡項目,目前LVS已經被內建到Linux核心子產品中。是中國國内最早出現的自由軟體項目之一。
LVS叢集采用IP負載均衡技術和基于内容請求分發技術。排程器具有很好的吞吐率,将請求均衡地轉移到不同的伺服器上執行,且排程器自動屏蔽掉伺服器的故障,進而将一組伺服器構成一個高性能的、高可用的虛拟伺服器。整個伺服器叢集的結構對客戶是透明的,而且無需修改用戶端和伺服器端的程式。為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
【章文嵩】百度百科:
- 曾經是TelTel公司的首席科學家,ChinaCluster的共同創辦人。
- 曾在阿裡巴巴任職近七年,曆任淘寶網資深技術總監、淘寶技術委員會主席、阿裡副總裁、阿裡開源委員會主席、阿裡雲CTO等。
- 2016年5月27日,任滴滴出行進階副總裁、負責CTO線基礎平台部兼工程技術委員會主席。
該項目在Linux核心中實作了基于IP的資料請求負載均衡排程方案,其體系結構如圖1所示,終端網際網路使用者從外部通路公司的外部負載均衡伺服器,終端使用者的Web請求會發送給LVS排程器,排程器根據自己預設的算法決定将該請求發送給後端的某台Web伺服器,比如,輪詢算法可以将外部的請求平均分發給後端的所有伺服器,終端使用者通路LVS排程器雖然會被轉發到後端真實的伺服器,但如果真實伺服器連接配接的是相同的存儲,提供的服務也是相同的服務,最終使用者不管是通路哪台真實伺服器,得到的服務内容都是一樣的,整個叢集對使用者而言都是透明的。最後根據LVS工作模式的不同,真實伺服器會選擇不同的方式将使用者需要的資料發送到終端使用者,LVS工作模式分為NAT模式、TUN模式、以及DR模式。
二、三種工作模式的解析
1、基于NAT的LVS模式負載均衡
NAT(Network Address Translation)即網絡位址轉換,其作用是通過資料報頭的修改,使得位于企業内部的私有IP位址可以通路外網,以及外部用使用者可以通路位于公司内部的私有IP主機。VS/NAT工作模式拓撲結構如圖2所示,LVS負載排程器可以使用兩塊網卡配置不同的IP位址,eth0設定為私鑰IP與内部網絡通過交換裝置互相連接配接,eth1裝置為外網IP與外部網絡聯通。
第一步,使用者通過網際網路DNS伺服器解析到公司負載均衡裝置上面的外網位址,相對于真實伺服器而言,LVS外網IP又稱VIP(Virtual IP Address),使用者通過通路VIP,即可連接配接後端的真實伺服器(Real Server),而這一切對使用者而言都是透明的,使用者以為自己通路的就是真實伺服器,但他并不知道自己通路的VIP僅僅是一個排程器,也不清楚後端的真實伺服器到底在哪裡、有多少真實伺服器。
第二步,使用者将請求發送至124.126.147.168,此時LVS将根據預設的算法選擇後端的一台真實伺服器(192.168.0.1~192.168.0.3),将資料請求包轉發給真實伺服器,并且在轉發之前LVS會修改資料包中的目标位址以及目标端口,目标位址與目标端口将被修改為選出的真實伺服器IP位址以及相應的端口。
第三步,真實的伺服器将響應資料包傳回給LVS排程器,排程器在得到響應的資料包後會将源位址和源端口修改為VIP及排程器相應的端口,修改完成後,由排程器将響應資料包發送回終端使用者,另外,由于LVS排程器有一個連接配接Hash表,該表中會記錄連接配接請求及轉發資訊,當同一個連接配接的下一個資料包發送給排程器時,從該Hash表中可以直接找到之前的連接配接記錄,并根據記錄資訊選出相同的真實伺服器及端口資訊。
2、基于TUN的LVS負載均衡
在LVS(NAT)模式的叢集環境中,由于所有的資料請求及響應的資料包都需要經過LVS排程器轉發,如果後端伺服器的數量大于10台,則排程器就會成為整個叢集環境的瓶頸。我們知道,資料請求包往往遠小于響應資料包的大小。因為響應資料包中包含有客戶需要的具體資料,是以LVS(TUN)的思路就是将請求與響應資料分離,讓排程器僅處理資料請求,而讓真實伺服器響應資料包直接傳回給用戶端。VS/TUN工作模式拓撲結構如圖3所示。其中,IP隧道(IP tunning)是一種資料包封裝技術,它可以将原始資料包封裝并添加新的標頭(内容包括新的源位址及端口、目标位址及端口),進而實作将一個目标為排程器的VIP位址的資料包封裝,通過隧道轉發給後端的真實伺服器(Real Server),通過将用戶端發往排程器的原始資料包封裝,并在其基礎上添加新的資料標頭(修改目标位址為排程器選擇出來的真實伺服器的IP位址及對應端口),LVS(TUN)模式要求真實伺服器可以直接與外部網絡連接配接,真實伺服器在收到請求資料包後直接給用戶端主機響應資料。
3、基于DR的LVS負載均衡
在LVS(TUN)模式下,由于需要在LVS排程器與真實伺服器之間建立隧道連接配接,這同樣會增加伺服器的負擔。與LVS(TUN)類似,DR模式也叫直接路由模式,其體系結構如圖4所示,該模式中LVS依然僅承擔資料的入站請求以及根據算法選出合理的真實伺服器,最終由後端真實伺服器負責将響應資料包發送傳回給用戶端。與隧道模式不同的是,直接路由模式(DR模式)要求排程器與後端伺服器必須在同一個區域網路内,VIP位址需要在排程器與後端所有的伺服器間共享,因為最終的真實伺服器給用戶端回應資料包時需要設定源IP為VIP位址,目标IP為用戶端IP,這樣用戶端通路的是排程器的VIP位址,回應的源位址也依然是該VIP位址(真實伺服器上的VIP),用戶端是感覺不到後端伺服器存在的。由于多台計算機都設定了同樣一個VIP位址,是以在直接路由模式中要求排程器的VIP位址是對外可見的,用戶端需要将請求資料包發送到排程器主機,而所有的真實伺服器的VIP位址必須配置在Non-ARP的網絡裝置上,也就是該網絡裝置并不會向外廣播自己的MAC及對應的IP位址,真實伺服器的VIP對外界是不可見的,但真實伺服器卻可以接受目标位址VIP的網絡請求,并在回應資料包時将源位址設定為該VIP位址。排程器根據算法在選出真實伺服器後,在不修改資料封包的情況下,将資料幀的MAC位址修改為選出的真實伺服器的MAC位址,通過交換機将該資料幀發給真實伺服器。整個過程中,真實伺服器的VIP不需要對外界可見。
三、LVS負載均衡排程算法
根據前面的介紹,我們了解了LVS的三種工作模式,但不管實際環境中采用的是哪種模式,排程算法進行排程的政策與算法都是LVS的核心技術,LVS在核心中主要實作了一下十種排程算法。
1.輪詢排程
輪詢排程(Round Robin 簡稱'RR')算法就是按依次循環的方式将請求排程到不同的伺服器上,該算法最大的特點就是實作簡單。輪詢算法假設所有的伺服器處理請求的能力都一樣的,排程器會将所有的請求平均配置設定給每個真實伺服器。
2.權重輪詢排程
權重輪詢(Weight Round Robin 簡稱'WRR')算法主要是對輪詢算法的一種優化與補充,LVS會考慮每台伺服器的性能,并給每台伺服器添加一個權值,如果伺服器A的權值為1,伺服器B的權值為2,則排程器排程到伺服器B的請求會是伺服器A的兩倍。權值越高的伺服器,處理的請求越多。
3.最小連接配接排程
最小連接配接排程(Least Connections 簡稱'LC')算法是把新的連接配接請求配置設定到目前連接配接數最小的伺服器。最小連接配接排程是一種動态的排程算法,它通過伺服器目前活躍的連接配接數來估計伺服器的情況。排程器需要記錄各個伺服器已建立連接配接的數目,當一個請求被排程到某台伺服器,其連接配接數加1;當連接配接中斷或者逾時,其連接配接數減1。
(叢集系統的真實伺服器具有相近的系統性能,采用最小連接配接排程算法可以比較好地均衡負載。)
4.權重最小連接配接排程
權重最少連接配接(Weight Least Connections 簡稱'WLC')算法是最小連接配接排程的超集,各個伺服器相應的權值表示其處理性能。伺服器的預設權值為1,系統管理者可以動态地設定伺服器的權值。權重最小連接配接排程在排程新連接配接時盡可能使伺服器的已建立連接配接數和其權值成比例。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。
5.基于局部的最少連接配接
基于局部的最少連接配接排程(Locality-Based Least Connections 簡稱'LBLC')算法是針對請求封包的目标IP位址的 負載均衡排程,目前主要用于Cache叢集系統,因為在Cache叢集客戶請求封包的目标IP位址是變化的。這裡假設任何後端伺服器都可以處理任一請求,算法的設計目标是在伺服器的負載基本平衡情況下,将相同目标IP位址的請求排程到同一台伺服器,來提高各台伺服器的通路局部性和Cache命中率,進而提升整個叢集系統的處理能力。LBLC排程算法先根據請求的目标IP位址找出該目标IP位址最近使用的伺服器,若該伺服器是可用的且沒有超載,将請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處于一半的工作負載,則使用'最少連接配接'的原則選出一個可用的伺服器,将請求發送到伺服器。
6.帶複制的基于局部性的最少連接配接
帶複制的基于局部性的最少連接配接(Locality-Based Least Connections with Replication 簡稱'LBLCR')算法也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統,它與LBLC算法不同之處是它要維護從一個目标IP位址到一組伺服器的映射,而LBLC算法維護從一個目标IP位址到一台伺服器的映射。按'最小連接配接'原則從該伺服器組中選出一一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按'最小連接配接'原則從整個叢集中選出一台伺服器,将該伺服器加入到這個伺服器組中,将請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。
7.目标位址散列排程
目标位址散列排程(Destination Hashing 簡稱'DH')算法先根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且并未超載,将請求發送到該伺服器,否則傳回空。
8.源位址散列排程U
源位址散列排程(Source Hashing 簡稱'SH')算法先根據請求的源IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且并未超載,将請求發送到該伺服器,否則傳回空。它采用的散列函數與目标位址散列排程算法的相同,它的算法流程與目标位址散列排程算法的基本相似。
9.最短的期望的延遲
最短的期望的延遲排程(Shortest Expected Delay 簡稱'SED')算法基于WLC算法。舉個例子吧,ABC三台伺服器的權重分别為1、2、3 。那麼如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用SED算法後會進行一個運算
A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把請求交給得出運算結果最小的伺服器。
10.最少隊列排程
最少隊列排程(Never Queue 簡稱'NQ')算法,無需隊列。如果有realserver的連接配接數等于0就直接配置設定過去,不需要在進行SED運算。
四、LVS的三層架構
- 負載排程器(load balancer),它是整個叢集對外面的前端機,負責将客戶的請求發送到一組伺服器上執行,而客戶認為服務是來自一個IP位址(我們可稱之為虛拟IP位址)上的。
- 伺服器池(server pool),是一組真正執行客戶請求的伺服器,執行的服務有WEB、MAIL、FTP和DNS等。
- 共享存儲(shared storage),它為伺服器池提供一個共享的存儲區,這樣很容易使得伺服器池擁有相同的内容,提供相同的服務。
五、LVS+KeepAlived+Nginx高可用實作方案
在大型網站中一般服務端會做叢集,同時利用負載均衡器做負載均衡。這樣有利于将大量的請求分散到各個伺服器上,提升網站的響應速度。當然為了解決單點故障的問題,還會做熱備份方案。這裡示範利用LVS做負載均衡器,同時利用Keepalived保證其高可用,基于LVS的DR模式建構Nginx叢集。
特别注意:
由于是采用DR模式,也即當使用者請求發送到VIP時,LVS會根據所設定的負載均衡算法将請求轉發到具體的Nginx伺服器(Real Server)上,而當具體的Nginx伺服器處理完後是直接将結果傳回給使用者。是以在具體的Nginx伺服器是要設定回環的IP,即在lo網卡上設定VIP的位址。
具體實作方式請參考博文LVS+KeepAlived+Nginx高可用實作方案及LVS + Keepalived + Nginx基于DR模式建構高可用方案
六、總結
1.優點
- 開源,免費
- 在網上能找到一些相關技術資源
- 具有軟體負載均衡的一些優點
2.缺點
- 最核心的就是沒有可靠的支援服務,沒有人對其結果負責;
- 功能比較簡單,支援複雜應用的負載均衡能力較差,如算法較少等;
- 開啟隧道方式需重編譯核心;
- 配置複雜;
- 主要應用于LINUX,目前沒有專門用于WINDOWS的版本,不過可以通過配置,使windows成為LVS叢集中的real server(win2003、win2008中)。