簡介:
下面對(duì)LVS的各個(gè)組成部分進(jìn)行詳細(xì)介紹 IPVS/NAT :即 Virtual Server via Network Address Translation,也就是網(wǎng)絡(luò)地址翻譯技術(shù)實(shí)現(xiàn)虛擬服務(wù)器。當(dāng)用戶請(qǐng)求到達(dá)調(diào)度器時(shí),調(diào)度器將請(qǐng)求報(bào)文的目標(biāo)地址(即 虛擬IP地址)改寫成選定的Real Server地址,同時(shí)將報(bào)文的目標(biāo)端口也改成選定的 Real Server的相應(yīng)端口,最后將報(bào)文請(qǐng)求發(fā)送到選定的Real Server。在服務(wù)器端得到數(shù)據(jù)后,Real Server將數(shù)據(jù)返回給用戶時(shí),需要再次經(jīng)過負(fù)栽調(diào)度器將報(bào)文的源地址和源端口改成虛擬IP地址和相應(yīng)端口,然后把數(shù)據(jù)發(fā)送給用戶,完成整個(gè)負(fù)栽調(diào)度過 程??梢钥闯?,在NAT方式下,用戶請(qǐng)求和響應(yīng)報(bào)文都必須經(jīng)過Director Server地址重寫, 當(dāng)用戶請(qǐng)求越來越多時(shí),調(diào)度器的處理能力將成為瓶頸. 如下圖所示:IPVS/NAT 架構(gòu)圖 NAT:多目標(biāo)的DNAT 特性:
適用場景:
結(jié)構(gòu)圖:
LVS/TUN :即Virtual Server via IP Tunneling,也就是通過IP隧道技術(shù)實(shí)現(xiàn)虛擬服務(wù)器。這種方式的連接調(diào)度度和管理與VS/NAT方式一樣,只是報(bào)文轉(zhuǎn)發(fā)方法不同。在 VS/TUN方式中,調(diào)度器采用IP隧道技術(shù)將用戶清求轉(zhuǎn)發(fā)到某個(gè)Real Server,而這 個(gè)Real Server 將直接響應(yīng)用戶的請(qǐng)求,不再經(jīng)過前端調(diào)度器。此外,對(duì)Real Server 的地域位置沒有要求,可以和Director Server位于同一個(gè)網(wǎng)段,也可以在獨(dú)立的一個(gè) 網(wǎng)絡(luò)中。因此,在TUN方式中,調(diào)度器將只處理用戶的報(bào)文請(qǐng)求,從而使集群系統(tǒng) 的吞吐量大大提高。如下圖所示VS/TUN 架構(gòu)圖: TUN:IP隧道,即含有多個(gè)IP報(bào)頭 特性:
適用場景:
結(jié)構(gòu)圖:
FULLNAT是一種新的轉(zhuǎn)發(fā)模式 特性:
適用場景:
結(jié)構(gòu)圖:
LVS/DR: 即Virtual Server via Direct Routing,也就是用直接路由技術(shù)實(shí)現(xiàn)虛擬服務(wù)器。 這種方式的連按調(diào)度和管理與前兩種一樣,但它的報(bào)文轉(zhuǎn)發(fā)方法又有所不同,VS/DR 通過改寫請(qǐng)求報(bào)文的MAC地址,將請(qǐng)求發(fā)送到Real Server,而Real Server將響應(yīng)直接返回給客戶.免去了VS/TUN中的IP隧道開銷,這種方式是3種負(fù)莪調(diào)度方式中 性能最好的,但是要求Director Server與Real Server必須由一塊網(wǎng)卡連在同一物理網(wǎng)段上。 如下圖所示:VS/DR 架構(gòu)圖 DR:Direct Routing 需解決的關(guān)鍵問題:
特性:
適用場景:
結(jié)構(gòu)圖: LVS-DR配置架構(gòu)根據(jù)其VIP與RIP是否在同一個(gè)網(wǎng)段內(nèi)又分為兩種模型:
LVS調(diào)度算法 (2)負(fù)我調(diào)度算法 靜態(tài)方法:僅根據(jù)算法本身進(jìn)行調(diào)度 rr:Round Robin # 即輪詢 wrr:Weighted RR # 即加權(quán)輪詢 sh:Source Hashing # 即來源IP地址hash dh:Destination Hashing # 即目標(biāo)地址hash(不常用,僅用于前端多防火墻的場景,保證防火墻的連接追蹤功能有效)
動(dòng)態(tài)方法:根據(jù)算法及RS當(dāng)前的負(fù)載情況 lc:Least Connection # 評(píng)判標(biāo)準(zhǔn):Overhead=Active*256+Inactive # Overhead最小者勝出 wlc:Weighted LC # 評(píng)判標(biāo)準(zhǔn):Overhead=(Active*256+Inactive)/weight # Overhead最小者勝出 sed:Shortest Expect Delay # 評(píng)判標(biāo)準(zhǔn):Overhead=(Active+1)*256/weight # Overhead最小者勝出 nq:Never Queue # 集群開始時(shí)工作時(shí),每臺(tái)服務(wù)器都至少分配一個(gè)連接請(qǐng)求,然后再根據(jù)sed算法調(diào)度; lblc:Locality-based Least Connection # 類似于dh+lc lblcr:Relicated and Locality-based Least Connection # 主要用于后端服務(wù)器是緩存服務(wù)器時(shí) 前 面介紹過,負(fù)載調(diào)度器是根據(jù)各個(gè)服務(wù)器的負(fù)栽情況,動(dòng)態(tài)地選擇一臺(tái)Real Server響 應(yīng)用戶請(qǐng)求。那么動(dòng)態(tài)選擇是如何實(shí)現(xiàn)呢?其實(shí)就是通過這里要說的負(fù)栽調(diào)度算法。根據(jù)不同的網(wǎng)絡(luò)眼務(wù)需求和眼務(wù)器配IPVS實(shí)現(xiàn)T8種負(fù)栽調(diào)度算法。這里詳 細(xì)講述最常用的4 種調(diào)度算法。 1、 輪詢(round robin, rr),加權(quán)輪詢(Weighted round robin, wrr)——新的連接請(qǐng)求被輪流分配至各RealServer;算法的優(yōu)點(diǎn)是其簡潔性,它無需記錄當(dāng)前所有連接的狀態(tài),所以它是一種無狀態(tài)調(diào)度。輪叫調(diào)度 算法假設(shè)所有服務(wù)器處理性能均相同,不管服務(wù)器的當(dāng)前連接數(shù)和響應(yīng)速度。該算法相對(duì)簡單,不適用于服務(wù)器組中處理性能不一的情況,而且當(dāng)請(qǐng)求服務(wù)時(shí)間變化 比較大時(shí),輪叫調(diào)度算法容易導(dǎo)致服務(wù)器間的負(fù)載不平衡。 2、 最少連接(least connected, lc), 加權(quán)最少連接(weighted least connection, wlc)——新的連接請(qǐng)求將被分配至當(dāng)前連接數(shù)最少的RealServer;最小連接調(diào)度是一種動(dòng)態(tài)調(diào)度算法,它通過服務(wù)器當(dāng)前所活躍的連接數(shù)來估計(jì)服務(wù) 器的負(fù)載情況。調(diào)度器需要記錄各個(gè)服務(wù)器已建立連接的數(shù)目,當(dāng)一個(gè)請(qǐng)求被調(diào)度到某臺(tái)服務(wù)器,其連接數(shù)加1;當(dāng)連接中止或超時(shí),其連接數(shù)減一。 3、 基于局部性的最少鏈接調(diào)度(Locality-Based Least Connections Scheduling,lblc)——針對(duì)請(qǐng)求報(bào)文的目標(biāo)IP地址的負(fù)載均衡調(diào)度,目前主要用于Cache集群系統(tǒng),因?yàn)樵贑ache集群中客戶請(qǐng)求報(bào)文 的目標(biāo)IP地址是變化的。這里假設(shè)任何后端服務(wù)器都可以處理任一請(qǐng)求,算法的設(shè)計(jì)目標(biāo)是在服務(wù)器的負(fù)載基本平衡情況下,將相同目標(biāo)IP地址的請(qǐng)求調(diào)度到同 一臺(tái)服務(wù)器,來提高各臺(tái)服務(wù)器的訪問局部性和主存Cache命中率,從而整個(gè)集群系統(tǒng)的處理能力。LBLC調(diào)度算法先根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo) IP地址最近使用的服務(wù)器,若該服務(wù)器是可用的且沒有超載,將請(qǐng)求發(fā)送到該服務(wù)器;若服務(wù)器不存在,或者該服務(wù)器超載且有服務(wù)器處于其一半的工作負(fù)載,則 用“最少鏈接”的原則選出一個(gè)可用的服務(wù)器,將請(qǐng)求發(fā)送到該服務(wù)器。 4、 帶復(fù)制的基于局部性最少鏈接調(diào)度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對(duì)目標(biāo)IP地址的負(fù)載均衡,目前主要用于Cache集群系統(tǒng)。它與LBLC算法的不同之處是它要維護(hù)從一個(gè) 目標(biāo)IP地址到一組服務(wù)器的映射,而 LBLC算法維護(hù)從一個(gè)目標(biāo)IP地址到一臺(tái)服務(wù)器的映射。對(duì)于一個(gè)“熱門”站點(diǎn)的服務(wù)請(qǐng)求,一臺(tái)Cache 服務(wù)器可能會(huì)忙不過來處理這些請(qǐng)求。這時(shí),LBLC調(diào)度算法會(huì)從所有的Cache服務(wù)器中按“最小連接”原則選出一臺(tái)Cache服務(wù)器,映射該“熱門”站 點(diǎn)到這臺(tái)Cache服務(wù)器,很快這臺(tái)Cache服務(wù)器也會(huì)超載,就會(huì)重復(fù)上述過程選出新的Cache服務(wù)器。這樣,可能會(huì)導(dǎo)致該“熱門”站點(diǎn)的映像會(huì)出現(xiàn) 在所有的Cache服務(wù)器上,降低了Cache服務(wù)器的使用效率。LBLCR調(diào)度算法將“熱門”站點(diǎn)映射到一組Cache服務(wù)器(服務(wù)器集合),當(dāng)該“熱 門”站點(diǎn)的請(qǐng)求負(fù)載增加時(shí),會(huì)增加集合里的Cache服務(wù)器,來處理不斷增長的負(fù)載;當(dāng)該“熱門”站點(diǎn)的請(qǐng)求負(fù)載降低時(shí),會(huì)減少集合里的Cache服務(wù)器 數(shù)目。這樣,該“熱門”站點(diǎn)的映像不太可能出現(xiàn)在所有的Cache服務(wù)器上,從而提供Cache集群系統(tǒng)的使用效率。LBLCR算法先根據(jù)請(qǐng)求的目標(biāo)IP 地址找出該目標(biāo)IP地址對(duì)應(yīng)的服務(wù)器組;按“最小連接”原則從該服務(wù)器組中選出一臺(tái)服務(wù)器,若服務(wù)器沒有超載,將請(qǐng)求發(fā)送到該服務(wù)器;若服務(wù)器超載;則按 “最小連接”原則從整個(gè)集群中選出一臺(tái)服務(wù)器,將該服務(wù)器加入到服務(wù)器組中,將請(qǐng)求發(fā)送到該服務(wù)器。同時(shí),當(dāng)該服務(wù)器組有一段時(shí)間沒有被修改,將最忙的服 務(wù)器從服務(wù)器組中刪除,以降低復(fù)制的程度。 5、 目標(biāo)地址散列調(diào)度(Destination Hashing,dh)算法也是針對(duì)目標(biāo)IP地址的負(fù)載均衡,但它是一種靜態(tài)映射算法,通過一個(gè)散列(Hash)函數(shù)將一個(gè)目標(biāo)IP地址映射到一臺(tái)服務(wù) 器。目標(biāo)地址散列調(diào)度算法先根據(jù)請(qǐng)求的目標(biāo)IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。 6、 源地址散列調(diào)度(Source Hashing,sh)算法正好與目標(biāo)地址散列調(diào)度算法相反,它根據(jù)請(qǐng)求的源IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。它采用的散列函數(shù)與目標(biāo)地址散列調(diào)度算法 的相同。除了將請(qǐng)求的目標(biāo)IP地址換成請(qǐng)求的源IP地址外,它的算法流程與目標(biāo)地址散列調(diào)度算法的基本相似。在實(shí)際應(yīng)用中,源地址散列調(diào)度和目標(biāo)地址散列 調(diào)度可以結(jié)合使用在防火墻集群中,它們可以保證整個(gè)系統(tǒng)的唯一出入口。 7、加權(quán)最少連接調(diào)度(Weighted Least Connections)。 8、sed:shorttest expect delay 最小期望延遲(改進(jìn)的wlc) 算法:overhead=(active+1)*256/weight,案例:假如DFG三臺(tái)機(jī)器分別權(quán)重123,連接數(shù)也分別是123.那么如果使用WLC算法的話一個(gè)新請(qǐng)求進(jìn)入時(shí)它可能會(huì)分給DFG中的任意一個(gè)。使用sed算法后會(huì)進(jìn)行這樣一個(gè)運(yùn)算: D(1+1)/1 F(1+2)/2 G(1+3)/3 9、nq:nerver queue 增強(qiáng)改進(jìn)的sed算法.如果有臺(tái)real Server的連接數(shù)=0直接分配,不需要再進(jìn)行sed運(yùn)算 2.高可用性
4、配置LVS 1、定義在Director上進(jìn)行dispatching的服務(wù)(service),以及哪此服務(wù)器(server)用來提供此服務(wù);
常用命令: 查看LVS上當(dāng)前的所有連接 __________ | | | client | |____________| CIP=192.168.0.253 (eth0) | | VIP=192.168.0.220 (eth0) ____________ | | | director | |____________| DIP=192.168.10.10 (eth1) | (switch)------------------------ | | RIP=192.168.10.2 (eth0) RIP=192.168.10.3 (eth0) _____________ _____________ | | | | | realserver1 | | realserver2 | |_____________| |_____________|
設(shè)置VS/NAT模式的LVS(這里以web服務(wù)為例) 建立服務(wù) # ipvsadm -A -t VIP:PORT -s rr 如: # ipvsadm -A -t 192.168.0.220:80 -s rr 設(shè)置轉(zhuǎn)發(fā): # ipvsadm -a -t VIP:PORT -r RIP_N:PORT -m -w N 如: # ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.2 -m -w 1 # ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.3 -m -w 1 打開路由轉(zhuǎn)發(fā)功能 # echo "1" > /proc/sys/net/ipv4/ip_forward 服務(wù)控制腳本: #!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init.d/functions # VIP=192.168.0.219 DIP=192.168.10.10 RIP1=192.168.10.11 RIP2=192.168.10.12 # case "$1" in start) /sbin/ifconfig eth0:1 $VIP netmask 255.255.255.0 up # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s rr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m /bin/touch /var/lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface ifconfig eth0:1 down rm -rf /var/lock/subsys/ipvsadm.lock ;; status) [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac
Real Server: route add default gw 192.168.10.10 注釋:在real server 上網(wǎng)關(guān)一定要指向director服務(wù)器的DIP,不然用戶請(qǐng)求的數(shù)據(jù)報(bào)文,在LVS/NAT模型中將無法發(fā)送出去. #!/bin/bash VIP=192.168.0.219 chmod 755 /etc/rc.d/init.d/functions /etc/rc.d/init.d/functions case "$1" in start) echo " start LVS of REALServer" /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 ;; stop) /sbin/ifconfig lo:0 down echo "close LVS Directorserver" echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0 {start|stop}" exit 1 esac ARP問題: __________ | | | client | |________| | | (router) | | | __________ | DIP | | |------| director | | VIP |__________| | | | ------------------------------------ | | | | | | RIP1, VIP RIP2, VIP RIP3, VIP ______________ ______________ ______________ | | | | | | | realserver1 | | realserver2 | | realserver3 | |______________| |______________| |______________|
在如上圖的VS/DR或VS/TUN 應(yīng)用的一種模型中(所有機(jī)器都在同一個(gè)物理網(wǎng)絡(luò)),所有機(jī)器(包括Director和RealServer)都使用了一個(gè)額外的IP地址,即VIP。當(dāng)一 個(gè)客戶端向VIP發(fā)出一個(gè)連接請(qǐng)求時(shí),此請(qǐng)求必須要連接至Director的VIP,而不能是RealServer的。因?yàn)?,LVS的主要目標(biāo)就是要 Director負(fù)責(zé)調(diào)度這些連接請(qǐng)求至RealServer的。 1、禁止RealServer響應(yīng)對(duì)VIP的ARP請(qǐng)求; arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface; 在RealServers上,VIP配置在本地回環(huán)接口lo上。如果回應(yīng)給Client的數(shù)據(jù)包路由到了eth0接口上,則arp通告或請(qǐng)應(yīng)該通過eth0實(shí)現(xiàn),因此,需要在sysctl.conf文件中定義如下配置: #vim /etc/sysctl.conf net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
以上選項(xiàng)需要在啟用VIP之前進(jìn)行,否則,則需要在Drector上清空arp表才能正常使用LVS。 # ipvsadm -lcn
為了保證其時(shí)效性,Hash table中“連接追蹤”信息被定義了“生存時(shí)間”。LVS為記錄“連接超時(shí)”定義了三個(gè)計(jì)時(shí)器: # ipvsadm --set 28800 30 600
數(shù)據(jù)包在由Direcotr發(fā)往 Realserver時(shí),只有目標(biāo)MAC地址發(fā)生了改變(變成了Realserver的MAC地址)。Realserver在接收到數(shù)據(jù)包后會(huì)根據(jù)本地路 由表將數(shù)據(jù)包路由至本地回環(huán)設(shè)備,接著,監(jiān)聽于本地回環(huán)設(shè)備VIP上的服務(wù)則對(duì)進(jìn)來的數(shù)據(jù)庫進(jìn)行相應(yīng)的處理,而后將處理結(jié)果回應(yīng)至RIP,但數(shù)據(jù)包的原地 址依然是VIP。 2、IPVS/DR
Director: IP分配 VIP=192.168.0.210 RIP1=192.168.0.221 RIP2=192.168.0.222 1、下載安裝ipvsadm wget http://www./software/kernel-2.6/ipvsadm-1.26.tar.gz tar zxvf ipvsadm-1.26.tar.gz cd ipvsadm-1.26 make && make install 2、編寫并運(yùn)行腳本(LVS服務(wù)器的腳本) vim director.sh #!/bin/bash # # LVS script for VS/DR # . /etc/rc.d/init.d/functions # VIP=192.168.0.210 RIP1=192.168.0.221 RIP2=192.168.0.222 PORT=80 # case "$1" in start) /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:1 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wlc # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig eth0:1 down /sbin/route del $VIP /bin/rm -f /var/lock/subsys/ipvsadm echo "ipvs is stopped..." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ]; then echo "ipvsadm is stopped ..." else echo "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac 3、給腳本加權(quán)限,并執(zhí)行 chmod 755 /etc/rc.d/init.d/functions chmod +x director.sh ./director.sh start 4、配置后端的WEB服務(wù)器腳本 vim realserver.sh #!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.219 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac 5、給腳本加權(quán)限,并執(zhí)行 chmod 755 /etc/rc.d/init.d/functions chmod +x realserver.sh ./realserver.sh start IPvsadm 的用法和格式如下: ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] ipvsadm --stop-daemon ipvsadm -h 命令選項(xiàng)解釋: 有兩種命令選項(xiàng)格式,長的和短的,具有相同的意思。在實(shí)際使用時(shí),兩種都可以。 -A --add-service 在內(nèi)核的虛擬服務(wù)器表中添加一條新的虛擬服務(wù)器記錄。也就是增加一臺(tái)新的虛擬服務(wù)器。 -E --edit-service 編輯內(nèi)核虛擬服務(wù)器表中的一條虛擬服務(wù)器記錄。 修改定義過的集群服務(wù) -D --delete-service 刪除內(nèi)核虛擬服務(wù)器表中的一條虛擬服務(wù)器記錄。 -C --clear 清除內(nèi)核虛擬服務(wù)器表中的所有記錄。 -R --restore 恢復(fù)虛擬服務(wù)器規(guī)則 -S --save 保存虛擬服務(wù)器規(guī)則,輸出為-R 選項(xiàng)可讀的格式 -a --add-server 在內(nèi)核虛擬服務(wù)器表的一條記錄里添加一條新的真實(shí)服務(wù)器記錄。也就是在一個(gè)虛擬服務(wù)器中增加一臺(tái)新的真實(shí)服務(wù)器 -e --edit-server 編輯一條虛擬服務(wù)器記錄中的某條真實(shí)服務(wù)器記錄 -d --delete-server 刪除一條虛擬服務(wù)器記錄中的某條真實(shí)服務(wù)器記錄 -L|-l --list 顯示內(nèi)核虛擬服務(wù)器表 userver 列表; -Z --zero 虛擬服務(wù)表計(jì)數(shù)器清零(清空當(dāng)前的連接數(shù)量等) --set tcp tcpfin udp 設(shè)置連接超時(shí)值 --start-daemon 啟動(dòng)同步守護(hù)進(jìn)程。他后面可以是master 或backup,用來說明LVS Router 是master 或是backup。在這個(gè)功能上也可以采用keepalived 的VRRP 功能。 --stop-daemon 停止同步守護(hù)進(jìn)程 -h --help 顯示幫助信息 其他的選項(xiàng): -t --tcp-service service-address 說明虛擬服務(wù)器提供的是tcp 的服務(wù)[vip:port] or [real-server-ip:port] -u --udp-service service-address 說明虛擬服務(wù)器提供的是udp 的服務(wù)[vip:port] or [real-server-ip:port] -f --fwmark-service fwmark 說明是經(jīng)過iptables 標(biāo)記過的服務(wù)類型。通常用于將兩個(gè)或兩個(gè)以上的服務(wù)綁定為一個(gè)服務(wù)進(jìn)行處理時(shí)使用; -s --scheduler scheduler 使用的調(diào)度算法,有這樣幾個(gè)選項(xiàng) rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認(rèn)的調(diào)度算法是:wlc. -p --persistent [timeout] 持久穩(wěn)固的服務(wù)。這個(gè)選項(xiàng)的意思是來自同一個(gè)客戶的多次請(qǐng)求,將被同一臺(tái)真實(shí)的服務(wù)器處理。timeout 的默認(rèn)值為300 秒。 持久連接; -M --netmask netmask persistent granularity mask -r --real-server server-address 真實(shí)的服務(wù)器[Real-Server:port] -g --gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 默認(rèn)的模式) DR模型 -i --ipip 指定LVS 的工作模式為隧道模式 -m --masquerading 指定LVS 的工作模式為NAT 模式 -w --weight weight 真實(shí)服務(wù)器的權(quán)值 --mcast-interface interface 指定組播的同步接口 -c --connection 顯示LVS 目前的連接 如:ipvsadm -L -c --timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout --daemon 顯示同步守護(hù)進(jìn)程狀態(tài) --stats 顯示統(tǒng)計(jì)信息 ipvsadm –Ln --state 總共的數(shù)量 --rate 顯示速率信息 ipvsadm –Ln --rete 平均值 --sort 對(duì)虛擬服務(wù)器和真實(shí)服務(wù)器排序輸出 --numeric -n 輸出IP 地址和端口的數(shù)字形式 集群相關(guān)的命令參數(shù): -A --add-service 在內(nèi)核的虛擬服務(wù)器表中添加一條新的虛擬服務(wù)器記錄。也就是增加一臺(tái)新的虛擬服務(wù)器。 -t --tcp-service service-address 說明虛擬服務(wù)器提供的是tcp 的服務(wù)[vip:port] or [real-server-ip:port] -u --udp-service service-address 說明虛擬服務(wù)器提供的是udp 的服務(wù)[vip:port] or [real-server-ip:port] -s --scheduler scheduler 使用的調(diào)度算法,有這樣幾個(gè)選項(xiàng) rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認(rèn)的調(diào)度算法是:wlc. -p --persistent [timeout] 持久穩(wěn)固的服務(wù)。這個(gè)選項(xiàng)的意思是來自同一個(gè)客戶的多次請(qǐng)求,將被同一臺(tái)真實(shí)的服務(wù)器處理。timeout 的默認(rèn)值為300 秒。 持久連接; -E --edit-service 編輯內(nèi)核虛擬服務(wù)器表中的一條虛擬服務(wù)器記錄。 修改定義過的集群服務(wù) -D :刪除指定集群服務(wù) RS相關(guān)的命令參數(shù): -a --add-server 在內(nèi)核虛擬服務(wù)器表的一條記錄里添加一條新的真實(shí)服務(wù)器記錄。也就是在一個(gè)虛擬服務(wù)器中增加一臺(tái)新的真實(shí)服務(wù)器 向指定的CS中添加RS -r --real-server server-address 真實(shí)的服務(wù)器[Real-Server:port],只有支持端口映射的LVS類型才允許此處使用跟集群服務(wù)中不同的端口 LVS 類型: -g : gateway,DR # 指定集群類型為LVS/DR -i ipip,TUN # 指定集群類型為LVS/TUN -m:masquerade,NAT # 指定集群類型為 NAT -w:指定RS權(quán)重: -e:修改指定的RS屬性 -d :從指定的集群服務(wù)中刪除某RS
LVS的持久連接: 持久連接即是不考慮LVS的轉(zhuǎn)發(fā)方法,確保所有來自同一個(gè)用戶的連接轉(zhuǎn)發(fā)到同一個(gè)RealServer上
lvs持久連接適用于大部分調(diào)度算法。當(dāng)某一種請(qǐng)求需要定向到一個(gè)real server 時(shí),就要用到持久連接 一般應(yīng)用到:ssl(http.https等),ftp。。 -p //表示此連接為持久連接 N //表示維持此持久連接的時(shí)間。默認(rèn)6分鐘。當(dāng)超過這個(gè)時(shí)間后,如果網(wǎng)頁還沒有關(guān)掉,仍處于激活狀態(tài),重新復(fù)位時(shí)間為2分鐘。 持久連接的類型: 1.PCC(persistent client connector,持久用戶連接)同一個(gè)用戶所有的請(qǐng)求在超時(shí)范圍之內(nèi)都被定位到同一個(gè)RealServer上,這個(gè)時(shí)候在指定端口的時(shí)候使用的是0端口,就是所有的請(qǐng)求都轉(zhuǎn)發(fā)出去。
2.PPC(persistent port connector)用戶的所有請(qǐng)求在超時(shí)范圍內(nèi)按照端口定位到不同的RS上。 3.防火墻標(biāo)記:把相關(guān)聯(lián)的端口在防火墻上打上同樣的標(biāo)記,用戶在訪問兩個(gè)相關(guān)聯(lián)的服務(wù)的時(shí)候,就會(huì)定位到同一個(gè)RealServer上。 4.FTP connection:由于ftp使用的是兩個(gè)端口號(hào),所以需要單獨(dú)列出來。 A.PCC實(shí)例:
Directory-------RealServer1(192.168.1.11) | |____RealServer2(192.168.1.12) VIP=192.168.1.10 Directory上的配置: #ifconfig eth0 192.168.1.9/24 #ifconfig eth0:0 192.168.1.10 broadcast 192.168.1.10 netmask 255.255.255.255 up #route add -host 192.168.1.10 dev eth0:0 #echo 1 >/proc/sys/net/ipv4/ip_forward #ipvsadm -A -t 192.168.1.10:0 -s rr -p 600 #ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.11:0 -g #ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.12:0 -g RealServer1上的配置: #ifconfig eth0 192.168.1.11/24 #ifconfig lo:0 192.168.1.10 broadcast 192.168.1.10 netmask 255.255.255.255 up #route add -host 192.168.1.10 dev lo:0 #echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore #echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore #echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce #echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce #yum install httpd #echo "rs1" > /var/www/html/index.html #service httpd start RealServer2上的配置: #ifconfig eth0 192.168.1.12/24 #ifconfig lo:0 192.168.1.10 broadcast 192.168.1.10 netmask 255.255.255.255 up #route add -host 192.168.1.10 dev lo:0 #echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore #echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore #echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce #echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce #yum install httpd #echo "rs2" > /var/www/html/index.html #service httpd start 在瀏覽其中輸入http://192.168.1.80然后刷新頁面,可以看到頁面一直不變,然后我們?cè)偈褂胹sh登錄到192.168.1.10,使用ifconfig查看,和網(wǎng)頁所在的RealServer同樣,實(shí)驗(yàn)完成!
B.PPC就是根據(jù)服務(wù)的不同,定向到不同的RealServer上,在Directory上多寫幾個(gè)ipvsadm指向,注意端口要區(qū)分開來就行了
C.防火墻標(biāo)記的持久連接
依然是上面的圖 兩個(gè)RealServer配置不變 在Directory上重新配置: #ipvsadm -C?。蹇読pvs表 #iptables -t mangle -A PREROUTING -d 192.168.1.10 -p tcp --dport 80 -j MARK --set-mark 10 把目的地為1982.168.1.10:80標(biāo)記為10 #ipvsadm -A -f 10 -s rr -p 60 //使用上面標(biāo)記的10定義集群服務(wù) #ipvsadm -a -f 10 -r 192.168.1.11 -g //為集群定義RealServer #ipvsadm -a -f 10 -r 192.168.1.12 -g 測(cè)試:
在瀏覽其中輸入http://192.168.1.10可以訪問到網(wǎng)頁,但是如果使用ssh連接192.168.1.10的話,就只能唄定向到192.168.1.12上也就是Directory上,實(shí)驗(yàn)完成 D.使用防火墻標(biāo)記實(shí)現(xiàn)http&&https姻親關(guān)系:
依然使用上面的拓?fù)鋱D: 1.首先在RS上做證書 ![]() #yum install mod_ssl #cd /etc/pki/tls/certs #make httpd.pem //在設(shè)置的時(shí)候,Common Name設(shè)置和Directory的主機(jī)名一樣就行了 #mkdir /etc/httpd/ssl #cp httpd.pem /etc/httpd/ssl #vim /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/ssl/httpd.pem SSLCertificateKeyFile /etc/httpd/ssl/httpd.pem ServerName node1.a.org:443 //我的Directory的主機(jī)名是node1.a.org #service httpd restart 2.其他的配置和上面一樣,同樣RealServer2上也采取同樣的配置,我這里就不演示了
3.Directory上的配置如下:
只需要在iptables上多添加一條命令如下 #iptables -t mangle -A PREROUTING -d 192.168.1.10 -p tcp --dport 443 -j MARK --set-mark 10 //這里的標(biāo)記和http的80端口的標(biāo)記是一樣的,這個(gè)時(shí)候在訪問的時(shí)候,就會(huì)建立姻親關(guān)系,其他的配置和C的配置一樣,不多演示了 測(cè)試:在瀏覽器中輸入http://192.168.1.80和https://192.168.1.80發(fā)現(xiàn)訪問的是同一個(gè)頁面,就證明成功啦!
因?yàn)長VS自身本沒有多后端real server 做健康狀態(tài)檢測(cè)的功能所以: 編寫健康狀態(tài)監(jiān)測(cè)腳本: LVS負(fù)載均衡器本身是沒有對(duì)后端服務(wù)器做健康狀態(tài)監(jiān)測(cè)的功能的;所以我們可以編寫一個(gè)小小的腳本來完成這個(gè)功能; 注釋:這些腳本的列子很粗糙,只是讓你們了解整個(gè)過程是怎樣的; 健康狀態(tài)監(jiān)測(cè)腳本實(shí)例: RS健康狀態(tài)檢查腳本示例第一版: #!/bin/bash # VIP=192.168.10.3 CPORT=80 FAIL_BACK=127.0.0.1 FBSTATUS=0 RS=("192.168.10.7" "192.168.10.8") RSTATUS=("1" "1") RW=("2" "1") RPORT=80 TYPE=g add() { ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 [ $? -eq 0 ] && return 0 || return 1 } del() { ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT [ $? -eq 0 ] && return 0 || return 1 } while :; do let COUNT=0 for I in ${RS[*]}; do if curl --connect-timeout 1 http://$I &> /dev/null; then if [ ${RSTATUS[$COUNT]} -eq 0 ]; then add $I ${RW[$COUNT]} [ $? -eq 0 ] && RSTATUS[$COUNT]=1 fi else if [ ${RSTATUS[$COUNT]} -eq 1 ]; then del $I [ $? -eq 0 ] && RSTATUS[$COUNT]=0 fi fi let COUNT++ done sleep 5 done RS健康狀態(tài)檢查腳本示例第二版: #!/bin/bash # VIP=192.168.10.3 CPORT=80 FAIL_BACK=127.0.0.1 RS=("192.168.10.7" "192.168.10.8") declare -a RSSTATUS RW=("2" "1") RPORT=80 TYPE=g CHKLOOP=3 LOG=/var/log/ipvsmonitor.log addrs() { ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 [ $? -eq 0 ] && return 0 || return 1 } delrs() { ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT [ $? -eq 0 ] && return 0 || return 1 } checkrs() { local I=1 while [ $I -le $CHKLOOP ]; do if curl --connect-timeout 1 http://$1 &> /dev/null; then return 0 fi let I++ done return 1 } initstatus() { local I local COUNT=0; for I in ${RS[*]}; do if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then RSSTATUS[$COUNT]=1 else RSSTATUS[$COUNT]=0 fi let COUNT++ done } initstatus while :; do let COUNT=0 for I in ${RS[*]}; do if checkrs $I; then if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then addrs $I ${RW[$COUNT]} [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG fi else if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then delrs $I [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG fi fi let COUNT++ done sleep 5 done |
|