Linux Virtual Server,簡稱LVS。是由中國一個Linux程序員發起的開發項目計劃,其實現目標是創建一個具有良好的擴展性、高可靠性、高性能和高可用性的,基于Linux系統的服務器集群。
1.LVS系統結構與特點
使用LVS架設的服務器集群系統從體系結構上看是透明的,最終用戶只感覺到一個虛擬服務器.物理服務器之間可以通過高速的LAN或分布在各地的WAN相連。最前端是負載均衡器,它負責將各種服務請求分發給后面的物理服務器,讓整個集群表現得象一個服務于同一IP地址的虛擬服務器。
LVS集群系統具有良好的可擴展性和高可用性。
可擴展性是指,LVS集群建立后,可以很容易地根據實際的需要增加或減少物理服務器。而高可用性是指當檢測到服務器節點或服務進程出錯、失效時,集群系統能夠自動進行適當的重新調整系統。
<cente>2.LVS是如何工作的
Linux Virtual Server的主要是在負載均衡器上實現的,負載均衡器是一臺加了LVS Patch的2.2.x版內核的Linux系統。LVS Patch可以通過重新編譯內核的方法加入內核,也可以當作一個動態的模塊插入現在的內核中。
負載均衡器可以運行在以下三種模式下中的一種或幾種: 1)Virtual Server via NAT(VS-NAT):用地址翻譯實現虛擬服務器;2)Virtual Server via IP Tunneling (VS-TUN):用IP隧道技術實現虛擬服務器;3)Virtual Server via Direct Routing(VS-DR):用直接路由技術實現虛擬服務器。
另外,還需要根據LVS應用對物理服務器進行恰當的配置。
以下將分別講述一下三種模式的工作原理和優缺點。
2.1.Virtual server via NAT(VS-NAT)
Virtual Server via NAT方法的最大優點是集群中的物理服務器可以使用任何支持TCP/IP操作系統,物理服務器可以分配Internet的保留私有地址,只有負載均衡器需要一個合法的IP地址。
這種實現方法的最大的缺點是擴展性有限。當服務器節點(普通PC服務器)數據增長到20個或更多時,負載均衡器將成為整個系統的瓶頸,因為所有的請求包和應答包都需要經過負載均衡器再生。假使TCP包的平均長度是536字節的話,平均包再生延遲時間大約為60us(在Pentium處理器上計算的,采用更快的處理器將使得這個延遲時間變短),負載均衡器的最大容許能力為8.93M/s,假定每臺物理服務器的平臺容許能力為400K/s來計算,負責均衡器能為22臺物理服務器計算。
Virtual Server via NAT能夠滿足許多服務器的服務性能需求。即使是是負載均衡器成為整個系統的瓶頸,如果是這樣也有兩種方法來解決它。一種是混合處理,另一種是采用Virtual Server via IP tunneling或Virtual Server via direct routing。如果采用混合處理的方法,將需要許多同屬單一的RR DNS域。你采用Virtual Server via IP tunneling或Virtual Server via direct routing以獲得更好的可擴展性。也可以嵌套使用負載均衡器,在最前端的是VS-Tunneling或VS-Drouting的負載均衡器,然后后面采用VS-NAT的負載均衡器。
2.2.Virtual server via IP tunneling(VS-TUN)
采用VS-NAT方式,請求與應答包都需要經過負載均衡器,那么當服務器節點增長到20個或更多時,這個負載均衡器就可能成為新的瓶頸。我們發現,許多Internet服務(例如WEB服務器)的請求包很短小,而應答包通常很大。
而使用VS-TUN方式的話,負載均衡器只負責將請求包分發給物理服務器,而物理服務器將應答包直接發給用戶。所以,負載均衡器能處理很巨大的請求量,這種方式,一臺負載均衡能為超過100臺的物理服務器服務,負載均衡器不再是系統的瓶頸。使用VS-TUN方式,如果你的負載均衡器擁有100M的全雙工網卡的話,就能使得整個Virtual Server能達到1G的吞吐量。
IP tunneling(IP隧道)能夠用于架構一個高性能的virtual server,非常適合構建virtual proxy server,因為當代理服務器收到了請求,能夠讓最終用戶直接與服務器聯系。
但是,這種方式需要所有的服務器支持"IP Tunneling"(IP Encapsulation)協議,我僅在Linux系統上實現了這個,如果你能讓其它操作系統支持,還在探索之中。
2.3.Virtual Server via Direct Routing(VS-DR)
就象VS-TUN一下,在VS-DR方式下,負載均衡器也只是分發請求,應答包通過單獨的路由方法返回給客戶端。這種方式能夠大大提高Virtual Server的可擴展性。與VS-TUN相比,VS-DR這種實現方式不需要隧道結構,但它要求負載均衡器的網卡必須與物理網卡在一個物理段上。
而且VS-DR模式,可以使用大多數操作系統做為物理服務器,其中包括:Linux 2.0.36、2.2.9、2.2.10、2.2.12;Solaris 2.5.1、2.6、2.7;FreeBSD 3.1、3.2、3.3;NT4.0無需打補??;IRIX 6.5;HPUX11等
3.安裝配置LVS
LVS的安裝配置主要可以分成以下三個步驟:
1) 下載LVS軟件;
2) 安裝、配置負載均衡器;
3) 安裝、配置物理服務器;
3.1. 安裝前的準備
1).下載LVS軟件:
大家可以到LVS的主頁(),選擇“Software”鏈接,選取最新版的補丁包(tar包)下載。這個包里包含了內核補丁和源程序。
2).安裝的指導思想
如果你選用了VS-NAT模式的話,則可以使用所有支持TCP/IP協議的操作系統構建的機器作物理服務器,并且無須做任何修改。
如果你選用了VS-TUN模式的話,則選擇Linux作物理服務器的操作系統,并根據后面的介紹做相應的設置。
如果你選用了VS-DR模式的話,則可以選擇大多數操作系統(如上節所述)作物理服務器,并根據后面的介紹做相應的設置。
3).各種操作系統作物理服務器的要點詳解
a)Linux 2.0.36
這種操作系統無需做任何修改,就可以運行在VS-NAT、VS-Tun、VS-DR三種模式下。
b)Linux 2.2.x
無需任何修改就可運行VS-NAT模式。而使用VS-DR和VS-Tun兩種模式可能會引起ARP問題。這種情況
就必須:¨ 為2.2.x內核打補丁
· Stephen WillIams的補丁包:
你可以在獲取,它的原理十分簡單:讓物理服務器不響應對虛擬IP的ARP請求。
· Julian Anastasov的補丁包:
你可以在處獲取,然后用以下方法使其生效:
echo 1 > /proc/sys/net/ipv4/conf/<interface_name>/arp_invisible
¨ 新添一塊網卡承載虛擬IP地址:
你可以選擇一塊ISA網卡或廉價的PCI網卡來用于這個功能。你可以將這個接口的ARP功能關閉。
¨ 將物理服務器放置于與虛擬IP地址不同的網絡上,并且確認客戶端無法直接路由到物理服務器所在網段。這種方法需要在負載均衡器上有兩塊網卡象防火墻一樣工作。
¨ 在客戶端或路由器將虛擬IP地址與負載均衡器的物理MAC地址綁定。
¨ 使用IPCHINA重寫每一個進入的包,將其從lo接口送入。
c)其它操作系統
如果是VS-NAT的話,無需修改。如果是VS-DR的話,需要采取一些相應的配置方法設置物理服務器的IP地址,使其擁有LVS的虛擬IP地址。用其它操作系統的話不能使用VS-Tun方法。
4).準備硬件環境
構建服務器集群系統,至少需要3臺機器,1臺用于負載均衡器,2臺用于物理服務器。少于這個數字的話就沒有意義了。
負載均衡器:運行在打了補丁的2.2.x核心Linux系統。
物理服務器:
VS-NAT:任何機器、任何操作系統,運行Internet網絡服務,如 HTTP、FTP、Telnet、SMTP、NNTP、DNS等。
VS-TUN:任何機器、支持IP隧道的操作系統(迄今為止僅有Linux)
VS-DR:任何機器、大多操作系統。
3.2. 理解LVS的相關術語
1).ipvsadm
ipvsadm是LVS的一個用戶界面。在負載均衡器上編譯、安裝ipvsadm:
ipvsadm sets
2).調度算法
LVS的負載均衡器有以下幾種調度規則:
Round-robin,簡稱rr,weighted Round-robin,簡稱wrr,每個新的連接被輪流指派到每個物理服務器。
Least-connected,簡稱lc,weighted Least-connected,簡稱wlc,每個新的連接被分配到負擔最小的服務器。
Persistent client connection,簡稱pclearcase/" target="_blank" >cc,(持續的客戶端連接,內核2.2.10版以后才支持)。所有來自同一個IP的客戶端將一直連接到同一個物理服務器。超時時間被設置為360秒。Pcc是為https和cookie服務設置的。在這處調度規則下,第一次連接后,所有以后來自相同客戶端的連接(包括來自其它端口)將會發送到相同的物理服務器。但這也會帶來一個問題,大約有25%的Internet可能具有相同的IP地址(AOL的
客戶是通過位于美國弗吉尼亞洲的一臺服務器連入Internet的),這種情況下只要有一個AOL的客戶連接到一個物理服務器上,那么所有來自AOL的客戶連接將都被連到這一臺物理服務器上。這將多么可怕呀!
3).Persistent port connection調度算法
在內核2.2.12版以后,pcc功能已從一個調度算法(你可以選擇不同的調度算法:rr、wrr、lc、wlc、pcc)演變成為了一個開關選項(你可以讓rr、 wrr、lc、wlc具備pcc的屬性)。在設置時,如果你沒有選擇調度算法時,ipvsadm將默認為wlc算法。
在Persistent port connection(ppc)算法下,連接的指派是基于端口的,例如,來自相同終端的80端口與443端口的請求,將被分配到不同的物理服務器上。
不幸的是,如果你需要在的網站上采用cookies時將出問題,因為http是使用80端口,然而cookies需要使用443端口,這種方法下,很可能會出現cookies不正常的情況。
3.3. 配置實例
1).例一:https only
a)在lvs_dr.conf 文件寫入:
SERVICE=t https ppc 192.168.1.1
b)Ipvsadm設置:
IP Virtual Server version 0.9.4 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ssl.mack.net:https wlc persistent 360
-> di.mack.net:https Route 1 0 0
2).例二:All ports sticky,超時為30分,wrr調度算法
a)在lvs_dr.conf 文件寫入:
SERVICE=t 0 wrr ppc -t 1800 192.168.1.1
#ppc persistent connection, timeout 1800 sec
/sbin/ipvsadm -A -t 192.168.1.110:0 -s wrr -p 1800
echo "adding service 0 to realserver 192.168.1.1 using connection
(接上行) type dr weight 1"
/sbin/ipvsadm -a -t 192.168.1.110:0 -R 192.168.1.1 -g -w 1
b)Ipvsadm設置:
# ipvsadm
IP Virtual Server version 0.9.4 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ssl.mack.net:https wrr persistent 1800
-> di.mack.net:https Route 1 0 0
3.4. 配置方法
1).準備
用配置腳本*.conf作為輸入產生rc.lvs腳本,然后放置在/etc/init.d或/etc/rc.d目錄下。
早期版本的配置腳本可以運行在任何機器上。然而現在的配置腳本,針對不同的內核版本是有些不同的。你必須在負載均衡器上運行、檢測內核版本。將在負載均衡器上的配置文件和目錄,通過nfs輸出這個
目錄到物理服務器上以供配置需要。 必須先在負載均衡器上運行腳本rc.lvs,然后在物理服務器上運行。
根據你選擇的LVS工作模式(VS-NAT、VS-Tun、VS-DR)選擇適當的conf文件模板(lvs_nat.conf、
lvs_tun.conf、lvs_dr.conf),然后根據實際情況修改IP地址與服務。在缺省狀態下只配置了telnet服務。
telnet服務能夠很方便地用于測試:當客戶機telnet登錄時,根據提示符就可以知道登錄到的是哪一臺物理
服務器。
你可以編輯conf配置文件來增加其它的服務。在配置文件中提供了集群內部的IP地址建議值
(192.168.1.x/24、10.1.1.x/24)。
在配置文件中,你可以使用名稱(如telnet)或端口(如23)來標識服務。使用名稱時要注意,須與
/etc/services中匹配。/etc/services文件內容如下所示:
ssh 22/tcp
domain 53/tcp nameserver dns #the string "dns" needs to be added here
domain 53/tcp nameserver dns #and here
https 443/tcp
https 443/udp
在多種情況下,一臺機器常需要多個IP地址,你可以使用IP別名(內核支持的可選項,一般情況下已含在內核中)來為一塊網卡指定多個IP地址。
2).運行配置腳本
$ ./configure.pl lvs_nat.conf
這將產生一個rc.lvs_xxx腳本(例如:rc.lvs_nat、rc.lvs_tun、rc.lvs_dr)以及mon_xxx.cf腳本。(稍后將rc.lvs_xxx放到/etc/rc.d或/etc/init.d中去,將mon_xxx.cf放在/etc/mon目錄下)。
3).rc.lvs腳本選項
a). 為負載均衡器與物理服務器增加以太網設備和路由器;
b).使用fping檢查連接;
c).運行ipchains(VS-NAT方式);
d).激活ipforward;
e).關閉ICMP重定向功能(VS-DR和VS-Tun方式);
f).增加ipvsadm服務。
4).繼續
在物理服務器上運行:
$ . ./rc.lvs_nat 或
$sh rc.lvs_nat
rc.lvs腳本能夠自動判斷是運行在負載均衡器(tests ?x /sbin/ipvsadm)還是物理服務器上(檢查ifconfig)。
檢查ipvsadm、ifconfig ?a和netstat ?rn的輸出,檢查服務/IP地址是否正確。如果不正確的話,請重
新編輯然后再運行一次。
3.5.測試LVS
檢查每一臺物理服務器上運行的服務,看它們的IP是不是LVS的虛擬IP—VIP(使用netstat ?an)。如果運行rc.lvs_xxx腳本沒有出錯的話,你從客戶端telnet到VIP(在本文中是192.168.1.110),你將會登錄到其中的一臺物理服務器上,并看到這臺物理服務器的登錄提示。
在負載均衡器上查看ipvsadm的輸出,你會在23端口上看到一個與物理服務器的連接。而在物理服務器上執行:$ netstat -an | grep 23命令查看到相關信息??蛻舳薼ogout退出后,再次登錄虛擬IP時,你將會看到另一臺物理服務器的登錄提示符。
4 VS-NAT模式
VS-NAT是基于CISCO的負載均衡器:LocalDirector實現的。
4.1.安裝VS-NAT
根據下表設置客戶端、負載均衡器、物理服務器的IP地址:
表21-2.客戶端、負載均衡器、物理服務器的IP地址
機 器 IP地址
客戶端 192.168.1.254
負載均衡器的虛擬IP 192.168.1.110(LVS表現的IP)
負載均衡器內部網卡 10.1.1.1
物理服務器1 10.1.1.2
物理服務器2 10.1.1.3
物理服務器3 10.1.1.4
…… ……
物理服務器n 10.1.1.n+1
物理服務器的默認
網關 10.1.1.1
對于VS-NAT方法來說,物理服務器必須位于與客戶機、LVS的虛擬IP地址不同的網段上,也就是說在物理服務器上不能直接PING通客戶機。
由于負載均衡器有兩個IP地址,一個是LVS的虛擬IP地址,另一個IP地址是內部地址--所有物理服務器默認網關。當數據包從物理服務器發送到負載均衡器時,負載均衡器根據地址翻譯(NAT)規則將包轉發到客戶端。(由于負載均衡器是一個地址翻譯器,所以ICMP的重定向功能失效,PING無法應用)??梢圆捎肐P別名的方法,也可以使用雙網卡方法來實現這個。
配置腳本將會配置IP偽裝。以下是在configure.pl腳本中的程序段:
echo "turning on masquerading "
#setup masquerading
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "installing ipchain rules"
/sbin/ipchains -A forward -j MASQ -s 10.1.1.0/24 -d 0.0.0.0/0
echo "ipchain rules "
/sbin/ipchains ?L
所有與NAT有關的規則設置都在rc.lvs_nat文件中表現。
4.2.配置VS-NAT
在負載均衡器以及每一臺物理服務器上分別執行rc.lvs_xxx腳本程序,使用lvs_nat.conf這個模板來生成rc.lvs_nat配置文件。
VS-NAT將會對端口重新映射,一個來自于80端口的請求,負載均衡器會將其發給物理服務器的8000端口。由于數據包的源地址和目標地址已經被重寫,所以無需對重新端口增加額外的開銷。很低的重寫數據包速度(60us/包)限制了VS-NAT的最大處理能力,而且VS-NAT的最大處理能力不是與增加的物理服務器成正比的。
VS-NAT實現方法的最大優點是物理服務器可以是任何一種操作系統,無需為了完成LVS而作任何修改,而且可以實現一些在Linux上不存在服務。
4.33.VS-NAT與Linux核心支持的NAT
當然可以使用ipchains或ipfw構建基于Linux內核的NAT防火墻。而使用了基于2.0.36版內核的LVS補丁包后,常規的內核模塊(如ip_masq_ftp等)不再工作(而且不再需要裝載)。
5.VS-DR模式
5.1.總論
VS-DR是基于IBM的NetDispathcer實現的。NetDispatcher位于WEB服務器的前端,對于客戶端來說就象一臺WEB服務器。NetDispatcher曾服務于奧運會、卡斯帕羅夫與深藍電腦的國際象棋比賽。
這里有一個VS-DR的IP地址設置的實例。注意:物理服務器與VIP位于同一個網絡上。
VS-DR模式在以下幾方面受到了限制
1) 物理服務器和負載均衡器必須在同一個網段上(它們之間必須能使用arp協議),它們之間在數據鏈路層上傳遞數據包;
2) 客戶端必須通過負載均衡器的VIP訪問集群;
3) 物理服務器必須有到客戶端的路由(即使客戶端沒有到物理服務器的路由)。因為從物理服務器返回到客戶商的包,將直接發送,無須通過負載均衡器轉發。
VS-DR模式下,客戶端通常與負載均衡器和物理服務器位于不同的網絡中,而且每一個物理服務器擁有自己對外的路由表。在下面這個簡單的例子中,所有的機器都在192.168.1.0這個網絡,物理服務器不需要設置默認路。網絡拓撲結構如下圖所示:
IP分配如下表所示:
表21-3 .IP分配
機 器 IP 地 址
客戶端 本機IP:CIP 192.168.1.254
負載均衡器 本機IP:DIP 192.168.1.1
虛擬IP:VIP 192.168.1.110(ARP與客戶端使用)
物理服務器1 本機IP:RIP 192.168.1.2
虛擬IP:VIP 192.168.1.110(不ARP)
物理服務器2 本機IP:RIP 192.168.1.3
虛擬IP:VIP 192.168.1.110(不ARP)
物理服務器3 本機IP:RIP 192.168.1.4
虛擬IP:VIP 192.168.1.110(不ARP)
5.2.VS-DR良好的擴展性
VS-NAT方法受限于經過負載均衡器的每一包都必須重寫,用這種方法最大的數據吞吐量受限于負載均衡器的環境。(如一臺Pentium機器,快速以太網,最大的數據吞吐量為80M/秒)而且增加物理服務器的數量并不能增加這個最大數據吞吐量。而使用VS-DR模式,速度限制則在每個物理服務器與Internet連接的包處理能力,而對負載均衡器的要求不大,因為其只需處理簡單的包。在VS-DR的模式下,能夠增加更多物理服務器以提高系統能力。
6 VS-TUN模式
6.1.總論
VS-Tun是LVS獨創的的,它是基于VS-DR發展的。具有良好的可擴展性和服務吞吐量。
使用VS-Tun方式的話,必須采Linux作為物理服務器,而負載均衡器將IP請求重新包裝成IPIP包后發給
物理服務器。所以物理服務器必須能夠解IPIP包裝才能,現在只有Linux操作系統能處理IPIP包(IP隧道技
術)。
不同于VS-DR,VS-Tun方案允許物理服務器與負載均衡器在不同的網絡上,甚至允許所有的機器都在
單獨的網絡上,那怕物理服務器位于不同的國家(例如:做一個項目的FTP站點鏡像)。在這種情況下物理
服務器將產生源地址=虛擬IP地址,目標地址=客戶機IP地址的IP包。
如果物理服務器與負載均衡器位于相同的網絡上,那么VS-DR和VS-Tun是等價的。VS-DR更具有靈活
性,因為大多數操作系統都可以用來構建物理服務器。
6.2. VS-Tun實例
以下是一個VS-Tun的IP配置實例。VS-Tun提供的最大方便性就是不需要服務器與客戶端位于同一個網絡上,僅需要客戶端能尋徑(有路由)到負載均衡器,物理服務器能尋徑(有路由)到客戶機。(返回的包直接從物理服務器到客戶端,無須再經過負載均衡器)
通常使用VS-Tun模式時,客戶端是與負載均衡器、物理服務器位于不同網絡上的,而且每一臺服務器
有一個通往外界的路由。
IP分配如下表所示:
表21-4.IP分配
機 器 IP 地 址
客戶端 本機IP:CIP 192.168.1.254
負載均衡器 本機IP:DIP 192.168.1.1
虛擬IP:VIP 192.168.1.110(ARP與客戶端使用)
物理服務器1 本機IP:RIP 192.168.1.2
虛擬IP:VIP 192.168.1.110(隧道技術,不ARP)
物理服務器2 本機IP:RIP 192.168.1.3
虛擬IP:VIP 192.168.1.110(隧道技術,不ARP)
物理服務器3 本機IP:RIP 192.168.1.4
虛擬IP:VIP 192.168.1.110(隧道技術,不ARP)
…… …… ……
物理服務器n 本機IP:RIP 192.168.1.n+1
虛擬IP:VIP 192.168.1.110(隧道技術,不ARP)
6.3.配置VS-Tun
1)編輯配置文件模板lvs_tun.conf后,進行配置:
$ ./configure_lvs.pl lvs_nat.conf
2)在物理服務器上運行:
$ . ./etc/rc.d/rc.lvs_tun
3)將配置文件放到/etc/rc.d或/etc/init.d目錄下。
4)檢查ipvsadm、ifconfig ?a和netstat ?rn的輸出,檢查服務/IP地址是否正確,如果有誤,請修改后重新運行腳本。