概述
LVS是工作在4層的負載均衡調度器,可根據請求報文的目標IP和目標協議及端口,根據指定的調度算法,將請求調度轉發至某RealServer,本篇就針對LVS的原理,配置和使用進行簡單介紹,具體包含:
1、LVS的四種類型的介紹
2、LVS調度算法的介紹
3、ipvsadm命令的用法介紹
4、LVS-NAT方式的配置示例
5、LVS-DR方式的配置示例
6、基于FWM(防火墻標記)的LVS的配置
7、LVS的持久連接機制的使用
第一章 LVS的四種類型的介紹
1、LVS的組成
ipvs:內核空間的框架,工作于內核上的netfilter的INPUT鉤子之上的程序,可根據用戶定義的集群實現請求轉發
ipvsadm:用戶空間的命令行程序,主要用于管理集群服務及集群服務器上的RS(后端真實服務主機)
2、LVS集群類型:
lvs-nat:修改請求報文的目標IP,相當于多目標的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外,新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP
3、LVS-NAT的介紹
LVS-NAT相當于iptables的多目標的DNAT,通過將請求報文中的目標地址和目標端口為挑選出來的后端RS的IP地址和PORT,基于連接追蹤機制,因此,其并發能力受到連接追蹤表的限制(相關連接追蹤表的內容,參考iptables相關內容),所以其并發量不大。一般后端調度的服務器數量不超過10臺
工作模型:
客戶端請求發往前端調度器,調度器在INPUT鏈上發現請求的是定義好的集群服務,然后將其報文的目標地址轉為后端某個提供真實服務的RIP的地址,發送給該real server,而后端real server處理完后,將響應結果響應給調度器,調度器收到后,根據內部的連接追蹤表,將響應報文的源地址改為自己VIP的地址,然后響應給客戶端
工作特性:
<1>多目標的DNAT,通過將請求報文中的目標地址和目端口修改為挑選出的而某real server的RIP和PORT實現轉發
<2>RIP和DIP必須在同一IP網絡,且應該使用私有地址,而且后端real server的網關要指向DIP(保證real server的響應報文必須經由調度器)
<3>請求報文和響應報文都經過Director轉發,較高負載下,Director容易成為系統瓶頸和單點故障所在
<4>支持端口映射
<5>director調度器必須是linux、后端real server可以是任意操作系統
工作拓撲結構
4、LVS-DR的介紹
通過修改請求報文的mac地址進行轉發(源MAC是DIP所在網卡的mac,目標mac是挑選出的某real server的RIP所在接口的MAC地址);IP首部不會發生變化(源地址是CIP,目標地址是VIP),因此為了讓Real Server能夠正常接收報文,要在Real Server上也配置VIP的地址
在各個real server的本地回環接口的子接口上配置一個IP地址,該IP地址與VIP相同,從而能夠實現由real server直接響應用戶請求,而不用轉交給director響應
各個real server和director連接在一個網絡中,相當于旁路部署的方式
工作模型:
director和real server上都只需要一個網卡,director的網卡IP是VIP,同時也會通過網卡別名的方式設置一個DIP,real server集群上的每個主機,也只有一個網卡,設置一個RIP,但會通過網卡別名設置一個跟director一樣的VIP,只是這個別名設置的VIP是隱藏的,不會用來接收任何的報文,只是響應外部請求的是后,用來偽裝以VIP的身份響應。
當請求進來后,源IP為CIP,目標IP為VIP,但此時只有director的VIP會響應,拿到報文后,director將報文進行幀首部拆封,通過查看IP和端口,發現是定義了集群的應用,然后將源MAC轉為自己的的MAC,目標MAC轉為某個RIP的MAC,然后將報文抓發給那個real server,當real server拿到報文后,解封裝,發現MAC是自己,然后目標IP是VIP,因為自己這里也有一個虛擬出來的VIP,故接受報文,然后響應,響應的時候,以VIP為源地址,CIP為目標地址進行相應。
此中工作模型下,由于director只負責接受進站的請求,由real server直接相應出站請求,一般進站的請求報文都比較小,故此種方式下,負載均衡性能是非常好的。
工作特性:
<1>確保前端路由器將目標IP為VIP的請求報文發往Director
有三種實現方法:
1) 在路由器上靜態綁定VIP和Director的MAC地址(但是不實用,因為如果對Director做了高可用,當當前綁定的MAC地址的Director故障后,那么在路由器上靜態綁定就要隨著修改)
2) 禁止各個real server上配置的VIP響應報文目標IP為VIP的請求(也就是在real server上,禁止本機的VIP響應ARP請求,禁止本機VIP向外通告)
可通過:
(a) arptables工具實現
(b) 修改real server的內核參數,并把VIP綁定在lo本地環回接口的別名上
內核參數為arp_ignore、arp_announce
<2>real server可以使用私有地址,也可以使用公網地址,RIP與DIP在同一網絡
<3>real server和director必須在同一物理網絡,因為二者之間使用MAC地址進行通信,real server的網關必須不能指向DIP
<4>請求報文必須由Director調度,但響應報文必須不能經過director,響應報文由RS直接發往Client
<5>不支持端口映射
<6>real server可使用大多數的操作系統
工作拓撲結構:
5、LVS-TUN介紹
director和real server不在同一個網絡中,當請求報文到達director時,此時源IP為CIP,目標IP為VIP。director進行轉發時,不會動原來的報文,而是在原來報文的基礎上,再加上一層IP報文,將外殼報文的源IP設置為DIP,目標IP設置為選定要轉發到的那臺real server的RIP,當real server收到報文后,解封裝,發現里面還有一個IP首部,源IP為CIP,目標IP為VIP,此種模型下real server上跟DR模型時類似,也有一個隱藏的VIP,故繼續解封裝后由real server直接響應客戶端,響應時源IP為VIP,目標IP為CIP。
工作特點:
<1>轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP首部之外再封裝一個IP首部(源IP為DIP,目標IP為挑選出來的real server的RIP)
<2>RIP、DIP、VIP全是公網地址
<3>real server的網關不能,也不可能指向DIP
<4>請求報文經由Director轉發,但響應報文將由real server直接發往客戶端CIP
<5>不支持端口映射
<6>real server的操作系統必須支持IP隧道功能
工作拓撲:
6、LVS-FULLNAT介紹
主要是為了解決lvs-nat模型中,各個real server不能跨網絡的問題,通過同時修改請求報文的源IP(CIP轉為DIP)和目標IP(VIP轉為RIP)全部進行NAT轉換來實現,此類型默認不支持,如果要使用,需要向內核打補丁
工作特點:
<1>VIP是公網地址,RIP是DIP是私有網絡地址,且通常不在同一網絡中,但需要經由路由器互通
<2>real server收到的請求報文源IP為DIP,因此響應報文將直接響應給DIP,Director再將報文處理后再發往Client
<3>請求和響應報文都經由Director
<4>支持端口映射
第二章 LVS調度算法的介紹
1、調度算法分類:
根據其調度是否考慮后端主機的當前負載的情況,可分為靜態方法和動態方法兩類:靜態方法和動態方法
靜態方法包括:RR、WRR、SH、DH
動態方法包括:LC、WLC、SED、NQ、LBLC、LBLCR
2、靜態調度方法:僅根據算法本身進行調度,不考慮后端RS當前負載情況
<1>RR:round robin,輪詢/輪調/輪叫,將請求輪流的調度到后端每一個RS上
<2>WRR:weighted round robin,加權輪詢,基于后端RS的權重,將請求按照權重,輪流調度到各個RS上
<3>SH:source hash,
源地址hash,主要用于會話保持,將來自于同一個源地址的請求,始終發往后端的同一臺real server上,指的是在一段時間內,只要是來自同一個客戶端的請求,一定會發往同一個后端real server服務器。主要目的是為了session affinity(會話綁定),實際是在WRR算法的基礎上,維持了一張會話表,表中記錄了源IP和其調度到的RS的對應關系
<4>DH:destination hash,
目標地址hash,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,多數用于緩存代理中,用于正向的web代理中(緩存),負載均衡內網用戶對外部服務器的請求,hash的是目標地址,將訪問目標IP一致的請求,都調度到同一個代理服務器上,用于提升在代理服務器上的緩存的命中率
3、動態調度方法:根據算法及各個real server當前的負載狀態進行調度
<1>LC:least connection
最少連接。通過計算每個real server的活動連接和非活動連接的總數,計算公式為 active*256+inactive,判斷哪臺服務器的連接數最小,就挑選誰作為調度對象
<2>WLC:weight lc加權最小連接
在lc的基礎上,考慮服務器自身性能作為權重依據,性能越好,權重值越大,公式為(active*256+inactive)/weight,判斷哪個的值最小,就將其作為調度對象,如果值一樣,就按排列在上面的作為調度對象
<3>SED:shortest expections delay,最短期望延遲
改進了的wlc,計算方式為(active+1)*256/weight,誰小,選誰
<4>NQ:never queue,永不排隊
改進了的sed,先根據權重,保證每個服務器上分配一個請求,然后再根據sed的算法,進行分配
<5>LBLC:locality-based LC,基于本地的最少連接。
有一個特點,類似動態的dh算法,將請求同一資源的客戶端發往同一個后端的服務器,但是是在考慮服務器空閑狀態的,利用wlc的計算方式。
<6>LBLCR:基于本地的帶復制功能的最少連接。利用緩存復制功能
第三章 ipvsadm命令的用法介紹
1、管理集群服務:增、改、刪、查
<1>增加、修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]
-A:增加
-E:修改
-t:tcp協議的某個服務添加為集群服務
-u:udp協議的某個服務添加為集群服務
-f:firewall mark 防火墻標記
service-address:
-t,TCP協議時,此地址對應為:VIP:PORT
-u,UDP協議時,此地址對應為:VIP:PORT
-f,防火墻標記時,此地址對應為:MARK(防火墻的標記)
-s scheduler:指明調度算法,省略此項時,默認為wlc
-p timeout:當定義LVS的持久連接時,指明持久連接時長
如:
ipvsadm -A -t 10.1.32.68:80 -s rr
表示添加一個tcp類型的集群服務,服務監聽的地址是10.1.32.68的80端口,采取的調度算法為rr算法
ipvsadm -A -t 10.1.32.68:3306 -s wlc
添加一個tcp類型的集群服務,服務監聽的地址是10.1.32.68的3306端口,采用的調度算法是wlc
ipvsadm -E -t 10.1.32.68:80 -s wlc修改集群服務
<2>刪除指定的集群服務
ipvsadm -D -t|u|f service-address
-D 刪除
如:
ipvsadm -D -t 10.1.32.68:80
2、集群上Real Server的管理
<1>增加、修改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a 增加
-e 修改,修改時不能修改real server的地址
-t|u|f service-address :與之前添加的那種協議的集群服務,及其對應的地址(要實現存在)
-r server-address:指明后端real server的地址,RIP[:PORT],可以不指定PORT,不加時,表示根定義集群服務時的端口一樣
[-g|i|m] 指明集群類型,不指名,則默認為lvs-dr模型
-g 表示gateway,也就是lvs-dr模型
-i 表示ipip,也就是lvs-tun模型
-m 表示masquerade,也就是lvs-nat模型
-w weight 指明權重,對于在定義集群服務時,指明的算法如果支持權重,則-w指明該real server的權重
如:
ipvsadm -a -t 10.1.32.68:80 -r 10.1.32.72 -m -w 2
表示向10.1.32.68:80這個tcp類型的集群服務添加一個real server,其地址為10.1.32.72,采用的集群工作模型為lvs-nat模型,該real server的權重為2
<2>刪除
ipvsadm -d -t|u|f service-address -r server-address
-d 刪除
-t|u|f service-address 指明從哪個集群服務中
-r server-address 表示刪除哪個real server
3、查看集群的相關信息:
ipvsadm -L|l [options]
options:
-n 表示數字格式顯示為IP和PORT,而不進行反解到主機名和服務
-exact 表示顯示大小單位時,不以M,G,而是以精確值來顯示大小
-c 表示顯示當前ipvs的連接的情況
–stats 表示顯示ipvs的統計數據,如發送報文速量,接受報文數量…
–rate 速率,顯示集群服務及real server上的平均每秒接受的報文速率、每秒發送的報文數量…
ipvsadm -Ln顯示出來的內容 Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.32.68:80 rr 集群服務及其采用的調度算法 -> 10.1.32.72:80 Masq 2 0 0 后端的real server的地址和對應的端口,以及采用的lvs的工作模型(nat、dr、tun),權重,活動連接數,非活動連接數 -> 10.1.32.73:80 Masq 3 0 0 ipvsadm -Ln --stats顯示出來的內容 Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.1.32.68:80 0 0 0 0 0 集群服務及當前整個集群的連接數,總共的入站的報文數,出站的報文數,入站的字節數,出站的字節數 -> 10.1.32.72:80 0 0 0 0 0 當前real server的地址和端口,當前real server的總共的連接數,入站報文數,出站報文數,入站字節數,出站字節數 -> 10.1.32.73:80 0 0 0 0 0 ipvsadm -Ln --rate 顯示出來的內容 Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP 10.1.32.68:80 0 0 0 0 0 當前集群的平均每秒的連接數,每秒的入站報文數,每秒出站報文數,每秒入站字節數,每秒出站字節數 -> 10.1.32.72:80 0 0 0 0 0 當前real server上平均每秒的連接數,每秒的入站報文數,每秒出站報文數,每秒入站字節數,每秒出站字節數 -> 10.1.32.73:80 0 0 0 0 0
4、清空所有ipvs規則:ipvsadm -C 表示清空當前ipvs上的所有的集群定義的規則
5、清空ipvs的計數器(接受報文數、發送報文數…)
ipvsadm -Z [-t|u|f service-address]
6、ipvs規則的保存和重載:
保存:
ipvsadm-save > /PATH/TO/FILE
ipvsadm -S > /PATH/TO/FILE
重載:
ipvsadm-restore < /PATH/FROM/FILE
ipvsadm -R < /PATH/FROM/FILE
第四章 LVS-NAT方式的配置示例
1、配置環境說明
2、在Director上安裝ipvsadm工具,在RS1和RS2上安裝LAMP軟件組合,驗證LAMP組合服務是否可用
修改LAMP組合的相關程序的配置文件,啟動服務,在RS1和RS2上提供測試頁面,啟動服務,查看LAMP組合是否正常
3、按照實驗拓撲,配置各個節點的網絡
4、在Director上定義集群服務,測試訪問
第五章 LVS-DR方式的配置示例
LVS-DR模型的實驗說明: 1、在各主機(Director、RS)上均需要配置VIP,因此,要解決地址沖突的問題,目標是讓RS上的VIP不可見,僅用于接受 目標地址為VIP的報文,同時可作為響應報文的源地址,可實現的方法: <1> 在前端的網關上進行靜態綁定,明確指明VIP的mac就是director的VIP對應的接口的mac地址 <2> 在各個RS上使用arptables。arptables的功能類似iptables,只是iptables是在IP層做過濾, 而arptables在可以基于mac地址做過濾,這樣就可以在real server上設置不允許響應arp的請求包 <3> 在各個RS上修改內核參數,內核上提供了兩個內核參數:arp_ignore 和arp_announce arp_ignore:定義接收到ARP請求時的響應級別。默認是0,接受的值有0-8,其中,0表示請求的IP地址配置 在本地的任何接口上,都進行相應;1表示請求的IP地址在配置在請求進來的接口上時,才進行相應。 arp_announce:定義將自己地址和MAC地址對應關系,向外通告時的通告級別。值為0,1,2。默認是0, 其中0表示將本機任何接口上的任何地址向每個接口進行通告;1表示試圖僅向目標網絡通告與其網絡匹配的地址; 2表示僅向與本地接口上地址匹配的網絡進行通告 故可以通過在real server上將虛擬的VIP配置到lo接口的別名上,如:lo:0上, 然后設置arp_ignore 為1,arp_announce為2,這樣就符合要求了 2、在使用了上述的第<3>方法阻止real server接受VIP的報文后,當director接收到請求報文,然后調度后, 轉發到某個real server上,當real server接收到請求,進行響應時,由于虛擬的VIP是配置在lo接口上,lo是 不對外進行響應的,而linux系統上,對外響應報文的源地址,一定是報文出去的接口的IP地址,但是請求報文 的目標地址是VIP,響應的源地址一定要是VIP,否則客戶端在接收到響應報文后會認為是非法報文,為了解決這 個問題,可以在real server上配置一條路由條目,將響應報文的源地址設置為lo上配置的假的VIP地址
1、實驗環境
2、在Director上按照拓撲結構,搭建實驗環境
3、在RS1上配置實驗所需的環境
3、在RS2上配置實驗所需環境
4、設定客戶端環境
5、在Director上定義集群,在客戶端進行驗證
6、補充說明: 通過以上幾個配置,就可以進行負載均衡了,但是這樣實現負載均衡的前提是,VIP、DIP、RIP在同一個網段內, 如果是向外提供服務的應用,那么這些主機上都要是公網地址。但是在實際生產環境中,基本上只要VIP是公網 地址,其他都是私有地址,為了實現這種情況的負載均衡,結構應該是這樣的,進口路由設備通過交換機接到 director上,這時路由接到交換機的口的地址,以及director的地址都是公有IP,然后各個real server連接到 交換機上,交換機還有另外一條線路通過別的路由器出去,或者是還有另外一條線路,接到之前那個路由器的另 外一個接口上,而路由器的這個接口上的IP為私有IP地址
第六章 基于FWM(防火墻標記)的LVS的配置
1、防火墻標記的相關概念
防火墻標記:在netfilter上給報文打標簽,應該在iptables的mangle表上實現,mangle表可在iptables的5個鏈(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)上都可以實現,標記的值為正整數
對ipvs而言,所有報文都是在INPUT鏈上進行處理的,所以如果要基于防火墻標記進行集群配置,則可以在PREROUTING鏈上對報文打上防火墻標記,然后再到INPUT鏈上用ipvs定義集群
2、利用防火墻標記定義LVS集群的意義
基于防火墻標記定義集群,可以將多個服務定義一個集群服務(前提是后端的real server也同時提供對應的多個服務)
還可以基于防火墻標記,進行LVS的持久連接
3、基于防火墻標記定義集群的示例:
在LVS-DR實驗的基礎上,利用防火墻標記,將httpd與mysql的服務定義為同一個調度對象,進行統一調度
第七章 LVS的持久連接機制
1、ipvs的持久連接的作用
基于一個持久連接模板,能實現,無論使用任何算法調度,都能進行在一段時間內,將來自于同一源IP的請求,始終發往后端同一real server,利用持久連接模板(實際是一段內存緩沖區域),模板內保存了每個客戶端及分配給他的real server 的映射關系
2、持久連接的類型
每端口持久(PPC):只持久一個服務
來自于同一個源IP對ipvs上定義的多個集群服務,當訪問某一個服務,如80端口的服務時,在定義的持久連接的時長內,都調度到某個real server上,但是當該客戶端請求該ipvs上定義的其他集群服務時,如22端口,則是重新調度到另外的真正提供22端口服務的real server上
每客戶端持久(PCC): 持久所有服務
只要是來自于同一客戶端的請求,無論訪問的是哪個集群服務,都調度到后端同一個real server上,前提是后端的real server要能同時提供多種集群定義的服務
每FWM持久:每防火墻標記持久,持久自定義的服務
將來自同一個防火墻標記的都發往同一個real server上,如此就可以靈活的將各種服務組織成同一個防火墻標記,然后對同一個防火墻標記進行持久連接的定義
3、配置每端口持久示例
4、配置每客戶端持久示例
5、定義每防火墻標記持久示例
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/54875