一、LVS簡介
LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器,是一個由章文嵩博士發起的自由軟件項目,官方站點是:
http://www.linuxvirtualserver.org。現在LVS已經是Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核心之后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能,高可用的服務器群集,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。
二、LVS體系架構
使用LVS架設的服務器集群系統有三個部分組成:最前端的負載均衡層(Loader Balancer),中間的服務器群組層,用Server Array表示,最底層的數據共享存儲層,用Shared Storage表示。在用戶看來所有的應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。
LVS的體系架構如圖:
LVS的各個層次的詳細介紹:
Load Balancer層:位于整個集群系統的最前端,有一臺或者多臺負載調度器(Director Server)組成,LVS模塊就安裝在Director Server上,而Director的主要作用類似于一個路由器,它含有完成LVS功能所設定的路由表,通過這些路由表把用戶的請求分發給Server Array層的應用服務器(Real Server)上。同時,在Director Server上還要安裝對Real Server服務的監控模塊Ldirectord,此模塊用于監測各個Real Server服務的健康狀況。在Real Server不可用時把它從LVS路由表中剔除,恢復時重新加入。
Server Array層:由一組實際運行應用服務的機器組成,Real Server可以是WEB服務器、MAIL服務器、FTP服務器、DNS服務器、視頻服務器中的一個或者多個,每個Real Server之間通過高速的LAN或分布在各地的WAN相連接。在實際的應用中,Director Server也可以同時兼任Real Server的角色。
Shared Storage層:是為所有Real Server提供共享存儲空間和內容一致性的存儲區域,在物理上,一般有磁盤陣列設備組成,為了提供內容的一致性,一般可以通過NFS網絡文件系統共享數 據,但是NFS在繁忙的業務系統中,性能并不是很好,此時可以采用集群文件系統,例如Red hat的GFS文件系統,oracle提供的OCFS2文件系統等。
從整個LVS結構可以看出,Director Server是整個LVS的核心,目前,用于Director Server的操作系統只能是Linux和FreeBSD,linux2.6內核不用任何設置就可以支持LVS功能,而FreeBSD作為 Director Server的應用還不是很多,性能也不是很好。對于Real Server,幾乎可以是所有的系統平臺,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
三、LVS基本工作原理
1、當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至內核空間
2、 PREROUTING鏈首先會接收到用戶請求,判斷目標IP確定是本機IP,將數據包發往INPUT鏈
3、 IPVS是工作在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和自己已定義好的集群服務進行比對,如果用戶請求的就是定義的集群服務,那么此時IPVS會強行修改數據包里的目標IP地址及端口,并將新的數據包發往POSTROUTING鏈
4、 POSTROUTING鏈接收數據包后發現目標IP地址剛好是自己的后端服務器,那么此時通過選路,將數據包最終發送給后端的服務器
四、LVS相關術語
1、 DS:Director Server。指的是前端負載均衡器節點。
2、 RS:Real Server。后端真實的工作服務器。
3、 VIP:向外部直接面向用戶請求,作為用戶請求的目標的IP地址。
4、 DIP:Director Server IP,主要用于和內部主機通訊的IP地址。
5、 RIP:Real Server IP,后端服務器的IP地址。
6、 CIP:Client IP,訪問客戶端的IP地址
五、三種模式及原理
一)LVS-NAT原理和特點
多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發
1.當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP
2. PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
3. IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為后端服務器IP,后將數據包發至POSTROUTING鏈。 此時報文的源IP為CIP,目標IP為RIP
4. POSTROUTING鏈通過選路,將數據包發送給Real Server
5. Real Server比對發現目標為自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP
6. Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址,然后響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP
LVS-NAT模式的特性
(1) RS應該和DIP應該使用私網地址,且RS的網關要指向DIP;
(2) 請求和響應報文都要經由director轉發;極高負載的場景中,director可能會成為系統瓶頸;
(3) 支持端口映射;
(4) RS可以使用任意OS;
(5) RS的RIP和Director的DIP必須在同一IP網絡;
缺陷:對Director Server壓力會比較大,請求和響應都需經過director server
二)LVS-DR原理和特點
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;
1、當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP
2、PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
3、 IPVS比對數據包請求的服務是否為集群服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然后將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址
4、 由于DS和RS在同一個網絡中,所以是通過二層來傳輸。POSTROUTING鏈檢查目標MAC地址為RIP的MAC地址,那么此時數據包將會發至Real Server。
5、 RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之后,將響應報文通過lo接口傳送給eth0網卡然后向外發出。 此時的源IP地址為VIP,目標IP為CIP
6、 響應報文最終送達至客戶端
LVS-DR模式的特性
(1) 確保前端路由器將目標IP為VIP的請求報文發往Director:
(a) 在前端網關做靜態綁定;
(b) 在RS上使用arptables;
(c) 在RS上修改內核參數以限制arp通告及應答級別;
修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在lo接口的別名上,并限制其不能響應對VIP地址解析請求。
(2) RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director;
(3) RS跟Director要在同一個物理網絡;
(4) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;
(5) 不支持端口映射;
缺陷:RS和DS必須在同一機房中
三)LVS-Tun原理和特點
在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址為CIP,目標IIP為VIP),外層IP首部(源地址為DIP,目標IP為RIP)
1、當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP 。
2、 PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
3、IPVS比對數據包請求的服務是否為集群服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然后發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP
4、 POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸)。 此時源IP為DIP,目標IP為RIP
5、 RS接收到報文后發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP后,會發現里面還有一層IP首部,而且目標是自己的lo接口VIP,那么此時RS開始處理此請求,處理完成之后,通過lo接口送給eth0網卡,然后向外傳遞。 此時的源IP地址為VIP,目標IP為CIP
6、響應報文最終送達至客戶端
LVS-Tun模式的特性
(1) DIP, VIP, RIP都應該是公網地址;
(2) RS的網關不能,也不可能指向DIP;
(3) 請求報文要經由Director,但響應不能經由Director;
(4) 不支持端口映射;
(5) RS的OS得支持隧道功能;
其實企業中最常用的是 DR 實現方式,而 NAT 配置上比較簡單和方便,后續實踐中會總結 DR 和 NAT 具體使用配置過程
五、LVS的十種調度算法
一)靜態調度:
? ? ? ①RR(Round Robin):輪詢調度
? ? ? 輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數),然后重新開始循環。算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度?!咎崾荆哼@里是不考慮每臺服務器的處理能力】
? ? ?②WRR:weight,加權輪詢(以權重之間的比例實現在各主機之間進行調度)
? ? ?由于每臺服務器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以,我們根據服務器的不同處理能力,給每個服務器分配不同的權值,使其能夠接受相應權值數的服務請求。
③SH:source hashing,源地址散列。主要實現會話綁定,能夠將此前建立的session信息保留了
源地址散列調度算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的并且沒有超負荷,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同。它的算法流程與目標地址散列調度算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址,所以這里不一個一個敘述。
④DH:Destination hashing:目標地址散列。把同一個IP地址的請求,發送給同一個server。
目標地址散列調度算法也是針對目標IP地址的負載均衡,它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
二)動態調度:
①LC(Least-Connection):最少連接
最少連接調度算法是把新的連接請求分配到當前連接數最小的服務器,最小連接調度是一種動態調度短算法,它通過服務器當前所活躍的連接數來估計服務器的負載均衡,調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1,當連接中止或超時,其連接數減一,在系統實現時,我們也引入當服務器的權值為0時,表示該服務器不可用而不被調度。
簡單算法:active*256+inactive(誰的小,挑誰)
②WLC(Weighted Least-Connection Scheduling):加權最少連接。
加權最小連接調度算法是最小連接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值為1,系統管理員可以動態地設置服務器的權限,加權最小連接調度在調度新連接時盡可能使服務器的已建立連接數和其權值成比例。
簡單算法:(active*256+inactive)/weight【(活動的連接數+1)/除以權重】(誰的小,挑誰)
③SED(Shortest Expected Delay):最短期望延遲
基于wlc算法
簡單算法:(active+1)*256/weight 【(活動的連接數+1)*256/除以權重】
④NQ(never queue):永不排隊(改進的sed)
無需隊列,如果有臺realserver的連接數=0就直接分配過去,不需要在進行sed運算。
⑤LBLC(Locality-Based Least Connection):基于局部性的最少連接
基于局部性的最少連接算法是針對請求報文的目標IP地址的負載均衡調度,不簽主要用于Cache集群系統,因為Cache集群中客戶請求報文的布標IP地址是變化的,這里假設任何后端服務器都可以處理任何請求,算法的設計目標在服務器的負載基本平衡的情況下,將相同的目標IP地址的請求調度到同一個臺服務器,來提高個太服務器的訪問局部性和主存Cache命中率,從而調整整個集群系統的處理能力。
基于局部性的最少連接調度算法根據請求的目標IP地址找出該目標IP地址最近使用的RealServer,若該Real Server是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。
⑥LBLCR(Locality-Based Least Connections withReplication):帶復制的基于局部性最少鏈接
? ? ? 帶復制的基于局部性最少鏈接調度算法也是針對目標IP地址的負載均衡,該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按“最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按“最小連接”原則從這個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89580
兄弟,牛!
文章內容很完善,結構也很完整,非常好,但是做為一篇博客文章來說的話,必須的排版來展示和區分文章結構還是很必須的,再接再勵。