一、LVS簡介
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。
負載均衡集羣(Load Balancing,簡稱爲LB)從工作在協議層來劃分爲TCP和應用層;TCP協議層是根據請求的目標地址和端口進行調度;應用層協議是根據請求的內容進行調度,而且此種調度爲“代理”方式,即反向代理。
二、LVS組成
LVS軟件由ipvs和ipvsadm兩個程序組成,ipvs是工作在內核中的;ipvsadm是工作在用戶空間,將爲工作在內核空間的ipvs定義集羣服務,作出調度決策算法的功能的一種工具,從功能上來看類似於netfilt.
2.1 LVS工作原理
ipvs工作於netfilter的INPUT鏈上;ipvsadm用於在ipvs上定義集羣服務:同時也得定義此集羣服務對應於有哪個後端主機可用;根據所指定的調度方法(算法)作出調度決策;
當用戶的請求到達本機時,首先經由PREROUTING鏈,到達PREROUTING鏈後進行路由判斷,經路由判斷後發現是送往本機的,將用戶請求送往INPUT鏈接中,此時ipvs將檢查INPUT鏈上的所有經過的報文,判斷是不是請求的集羣服務,如果請求的是集羣服務,ipvs將“攔下”服務,經過調度算法挑選出一個時先定義好的主機,並將用戶請求服務轉發出去,經由網絡將用戶請求送往後端主機併爲用戶提供服務響應。
2.2 LVS常見術語約定
爲用戶提供挑選後端服務器的主機稱爲調度器(Director);後端提供服務的主機稱爲Real Server (簡寫爲RS)。
客戶端(Client)的IP稱爲CIP;被DNS域名解析後的IP稱爲VIP(Director Virtual IP);調度器面向後方的集羣的IP稱爲DIP(Director IP);Real Server服務器上的IP稱爲RIP(Real Server)。
2.3 LVS的類型
LVS的類型分爲lvs-nat、lvs-dr、lvs-tun、lvs-fullnat。
三、lvs-nat
lvs-nat非常類似於DNAT,支持多目標轉發,它是通過修改請求報文的目標地址並根據調度算法所挑選出的某RS的RIP來進行轉發。
當用戶請求報文到達Director時,源地址爲CIP目標地址爲VIP,Director經過內部路由後發現是送往本機的,就送往INPUT鏈,ipvs將檢查在INPUT鏈發現對CIP請求的是集羣服務,根據在ipvs中指明的RS1和RS2,並根據內部的調度算法,挑選出一臺RS爲本次請求服務,此時更改請求報文中的目標地址改爲挑選出的RS的IP地址如“CIP:RIP1”,並經由forward鏈轉發出去,在報文到達RS1服務器是源地址是CIP目標地址是RS1的IP地址(即本機的IP地址),本機運行着有用戶請求服務,RS1進行報文響應,響應報文的源地址是RIP1,目標地址是CIP,即“RIP1:CIP”;到響應報文達到Director時,Director根據內部的NAT追蹤機制,發現用戶訪問的是CIP,因此Director將進行修改源地址爲VIP,報文格式“VIP:CIP”。
lvs-nat架構特性:
(1) RS應該使用私有地址,即RIP應該爲私有地址;各RS的網關必須指向DIP;
(2) 請求和響應報文都經由Director轉發;高負載場景中,Director易於成爲系統瓶頸;
(3) 支持端口映射;
(4) RS可以使用任意類型的OS;
(5) RS的RIP必須與Director的DIP在同一網絡;
四、lvs-dr
lvs-dr模型即爲直接路由;Director在實現轉發時不修改請求的IP首部,而是通過直接封裝MAC首部完成轉發;目標MAC是Director根據調度方法挑選出某RS的MAC地址;拓撲結構有別有NAT類型;
當用戶請求到達路由器,路由器經過路由到達交換機,並把用戶請求交給Director,Director經過調度至RS服務器,RS服務器在響應是並不經過Director,而是直接經交換機-->路由器送往用戶。
在Director服務器的網卡上配置DIP,在網卡別名上配置VIP;在RS服務器上的網卡配置RIP,把VIP配置到RS服務器內部的lo網卡的別名上如lo:1。當用戶請求到達時,首先到達路由器,路由器通過路由送往另一個接口,此接口經過ARP廣播,解析到內網中VIP的MAC地址。此時路由器會收到三個VIP的MAC地址,顯然這不是我們希望得到的結果,我們得想辦法讓RS服務器不能響應路由器ARP廣播請求解析得到VIP的MAC地址,或者響應了不讓響應請求出去;這樣就能保證只有Director的VIP會響應ARP廣播請求解析VIP的MAC地址。當路由器得到VIP的MAC地址時,路由器會進行封裝報文幀,在源報文的基礎上加上自己的MAC地址和ARP廣播請求解析VIP的MAC地址,然後報文到達Director服務器,Director發現請求的報文是本機的地址,把報文送往INPUT鏈,ipvs發現這是一個請求的集羣服務,根據調度算法挑選出一個RS如RS1,並ARP廣播請求解析RS1的RIP地址的MAC得到RS1的RIP地址的MAC地址,源IP地址和目標IP沒有變,只是修改源MAC和目標MAC地址變成了Director的和RS1的RIP的Mac地址。當報文送往RS1服務器,RS1服務器判斷源IP和目標IP是自己本機上,並響應服務封裝報文,源IP是VIP,目標IP是CIP,將報文發送給RS1設置的網關地址路由器接口。
此時會有一個問題,在Linux中由哪塊網卡發送出去目標IP就是哪塊網卡的IP地址,這裏可以要求強求報文必須由lo出去,但lo出不去的,可以通過forward鏈轉發出去的。
架構特性:
(1) 保證前端路由器將目標地址爲VIP的請求報文通過ARP地址解析後送往Director;
解決方案:
靜態綁定:在前端路由直接將VIP對應的目標MAC靜態配置爲Director的MAC地址;
arptables:在各RS上,通過arptables規則拒絕其響應對VIP的ARP廣播請求;
內核參數:在RS上修改內核參數,並結合地址的配置方式實現拒絕響應對VIP的ARP廣播請求;
(2) RS的RIP可以使用私有地址;但也可以使用公網地址,此時可通過互聯網上的主機直接對此RS發起管理操作(不安全);
(3) 請求報文必須經由Director調度,但響應報文必須不能經由Director;
(4) 各RIP必須與DIP在同一個物理網絡中;
(5) 不支持端口映射;
(6) RS可以使用大多數的OS;
(7) RS的網關一定不能指向Director;
五、lvs-tun
lvs-tun不修改請求報文IP首部,而是通過IP隧道機制在原有的IP報文之外再封裝IP首部,經由互聯網把請求報文交給選定的RS;
架構特性:
(1) RIP, DIP, VIP都是公網地址;
(2) RS的網關不能,也不可能指向DIP;
(3) 請求報文由Director分發,但響應報文直接由RS響應給Client;
(4) 不支持端口映射;
(5) RS的OS必須得支持IP隧道;
六、lvs-fullnat
lvs-fullnat並不是LVS官方的模型,這是由淘寶開發團隊開發的一種模型,並沒有被官方收錄至LVS中,要使用lvs-fullnat模型需要重新經內核打補丁,並重新編譯內核。
lvs-fullnat:通過請求報文的源地址爲DIP,目標爲RIP來實現轉發;對於響應報文而言,修改源地址爲VIP,目標地址爲CIP來實現轉發;
架構特性:
(1) RIP,DIP可以使用私有地址;
(2) RIP和DIP可以不在同一個網絡中,且RIP的網關未必需要指向DIP;
(3) 支持端口映射;
(4) RS的OS可以使用任意類型;
(5) 請求報文經由Director,響應報文經由Director;
七、LVS調度算法
類型 | 算法 | 說明 |
靜態方法 | RR | round-robin, 輪詢; |
WRR | weighted round-robin, 加權輪詢;Overhead=conn/weight | |
SH | Source ip Hashing,源地址哈希;把來自同一個地址請求,統統定向至此前選定的RS; | |
DH | Destination ip Hashing, 目標地址哈希;把訪問同一個目標地址的請求,統統定向至此前選定的某RS; | |
動態方法 | LC | least connection:最小連接,Overhead=Active*256+Inactive |
WLC | weighted least connection:加權最小連接,Overhead=(Active*256+Inactive)/weight;默認的調度算法 | |
SED | Shorted Expection Delay:最短期望延遲,Overhead=(Active+1)*256/weight | |
NQ | Never Queue:永不排序 | |
LBLC | Local-Based Least Connection,基於本地的最小連接:動態方式的DH算法 | |
LBLCR | Replicated LBLC:帶複製的LBLCR |
八、LVS-NAT實現
通過前面的原理介紹,這裏來實現一下lvs-nat模型,將要使用三臺虛擬機,客戶端就用物理機來訪問;RS-1和RS-2的網卡要使用Vmware Workstation中的僅主機模式,Director要使用兩張網卡,一個用於當VIP一個用於當DIP,DIP網卡要使用僅主機模式與後端RS使用一個私有網絡地址;
Real Server分別開啓Web服務器用於測試,頁面就是種RealServer的名稱,使用rr調度算法進行輪詢,這樣更容易看出效果。
8.1 RealServer的配置
(1)配置IP地址及網關
ifconfig 192.168.190.81/24 up #設置IP地址,如果你已經設置好了,此步可以省略的
route add default gw 192.168.190.100 設置默認網關
[root@RS-1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.190.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.190.100 0.0.0.0 UG 0 0 0 eth0
(2)啓動httpd服務
# service httpd start
8.2 Director的配置
(1)配置IP地址
如果你已經設置好了,此步可以省略;
ifconfigeth0 172.16.9.100/16 up ifconfigeth1 192.168.190.100/24 up
(2)開啓路由間轉發
echo 1 > /proc/sys/net/ipv4/ip_forward [root@LVS ~]# cat/proc/sys/net/ipv4/ip_forward
1
(3)配置LVS
如果你沒有安裝ipvsadm,需要在配置好yum源之後直接yum install ipvsadm即可;
ipvsadm -C ipvsadm -A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r192.168.190.81:80 -m ipvsadm -a -t 172.16.9.100:80 -r192.168.190.82:80 -m
#-C:表示清空ipvsadm中的所有定義的集羣服務
#-A:定義集羣服務
#-t:承載的應用層協議爲基於TCP協議提供服務的協議;其service-address的格式爲“VIP:PORT”,如“172.16.100.6:80”;
#-s:指定調度算法,默認爲wlc
#-a:創建集羣服務上的RS
#-r:指明RS,server-address格式一般爲“IP[:PORT]”;注意,只支持端口映射的lvs類型中才應該顯式定義此處端口
#-m:指明LVS的類型爲nat
[root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 192.168.190.81:80 Masq 1 0 0 -> 192.168.190.82:80 Masq 1 0 0
(4)在瀏覽器中訪問測試
在瀏覽器中輸入VIP的地址,不斷的刷新將會出現輪詢的效果。
九、LVS-DR實現
Real Server分別開啓Web服務器用於測試,頁面就是種RealServer的名稱,使用rr調度算法進行輪詢,這樣更容易看出效果。
9.1 Real Server的配置
各Real Server的配置都是一樣的,這們就介紹一個Real Server的配置即可。
(1)抵制ARP對VIP的請求
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
(2)配置VIP地址及路由
ifconfig lo:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev lo:0
(3)啓動HTTP服務
service httpd start
(4)在瀏覽器中訪問測試
9.2 Director上的配置
(1)配置VIP
ifconfig eth0:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev eth0:0
(2)配置ipvs服務
ipvsadm-A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.81-g ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.82-g
(3)檢查ipvs配置信息
[root@node-03 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 17.16.9.81:80 Route 1 0 0 -> 17.16.9.82:80 Route 1 0 0
(4)在瀏覽器中瀏覽
不斷的刷新將會出現輪詢的效果。
完