lvs的持久性連接有兩方面:
1 2 3 4 5 6 7 8 9 10 11 12 | ipvsadm # 可以查看連接空閑的超時時間(persistent 10)。 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 122.225.32.142:http rr persistent 10 -> 122.225.32.137:http Route 1 0 1 -> 122.225.32.136:http Route 1 0 0 ipvsadm -L -timeout # 查看tcp tcpfin udp的超時時間 Timeout (tcp tcpfin udp): 900 120 300 |
ipvsadm -LcnIPVS connection entriespro expire state source virtual destinationTCP 00:57 NONE 110.184.96.173:0 122.225.32.142:80 122.225.32.136:80TCP 01:57 FIN_WAIT 110.184.96.173:54568 122.225.32.142:80 122.225.32.136:80
當一個client訪問vip的時候,ipvs或記錄一條狀態(tài)為NONE的信息,expire初始值是persistence_timeout的值,然后根據(jù)時鐘主鍵變小,在以下記錄存在期間,同一client ip連接上來,都會被分配到同一個后端。
FIN_WAIT的值就是tcp tcpfin udp的超時時間,當NONE的值為0時,如果FIN_WAIT還存在,那么NONE的值會從新變成60秒,再減少,直到FIN_WAIT消失以后,NONE才會消失,只要NONE存在,同一client的訪問,都會分配到統(tǒng)一real server。
ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中紅色標記的80端口,表示同一客戶端訪問服務器的80端口,會被定義到同一個real server,如果把80端口改為0,那么同一客戶端訪問服務器的任何服務都會被轉發(fā)到同一real server。
修改keepalived配置文件,在虛擬服務器配置下面加入persistence_timeout 60
ipvsadm –set tcp tcpfin udp# ipvsadm –set 120 50 50 //實例
建議:tcpfin的值最好小于persistence_timeout的值,這樣比較方便計算。
http://www.linuxvirtualserver.org/docs/persistence.html
本文出自 “成長全記錄” 博客,請務必保留此出處http://lymrg.blog.51cto.com/1551327/684681
由于HTTP是一種無狀態(tài)協(xié)議,每次請求完畢之后就立即斷開了,當用戶瀏覽購物網(wǎng)站挑選商品的時候,看到一件商品加入購物車,此過程被重定向到了REALSERVER1上面來,當把第二件商品加入購物車又被重定向到了REALSERVER2上面,最后結賬的時候在REALSERVER2上面,只有一件商品,這顯然是用戶無法接受的,此時就需要一種持久連接機制,來把同一用戶的HTTP請求在超時時間內(nèi)都重定向到同一臺REALSERVER,超時時間可以自己定義,比如說2個小時,在超時時間內(nèi)服務器會不斷追蹤用戶的訪問請求,把某一用戶的所有請求都轉發(fā)到同一臺REALSERVER上面,如果超時時間過后用戶依然在訪問,則默認按照每次兩分鐘的方式無限加長
這里的所有操作都以DR模型為例,試驗環(huán)境參見:http://lymrg.blog.51cto.com/1551327/660925
對于LVS的持久連接來說常見的分為三種PCC,PPC和基于防火墻標記的持久連接,下面我們就來分別討論
PCC用來實現(xiàn)把某個用戶的所有訪問在超時時間內(nèi)定向到同一臺REALSERVER,這種方式在實際中不常用
ipvsadm -A -t 192.168.0.1:0 -s wlc -p 600(單位是s)ipvsadm -a -t 192.168.0.1:0 -r 192.168.1.2 -w 4 -gipvsadm -a -t 192.168.0.1:0 -r 192.168.1.3 -w 2 -g
此時測試一下會發(fā)現(xiàn)通過HTTP訪問VIP和通過SSH登錄VIP的時候都被定向到了同一臺REALSERVER上面了
PPC用來把某個用戶對同一服務的訪問在超時時間內(nèi)定向到同一臺REALSERVER
ipvsadm -A -t 192.168.0.1:80 -s wlc -p 600ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -w 4 -gipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -w 2 -gipvsadm -A -t 192.168.0.1:22 -s wlc -p 300ipvsadm -a -t 192.168.0.1:22 -r 192.168.1.2 -gipvsadm -a -t 192.168.0.1:22 -r 192.168.1.3 -g
此時再測試會發(fā)現(xiàn)某個用戶在超時時間內(nèi)對于某個服務的訪問都會被重定向到同一臺REALSERVER上面
基于防火墻標記的持久連接
對于電子商務網(wǎng)站來說,用戶在挑選商品的時候使用的是80端口來瀏覽的,當付款的時候則是通過443的ssl加密的方式,當然當用戶挑選完商品付款的時候我們當然不希望https的443跳轉到另外一臺REALSERVER,很顯然應該是同一REALSERVER才對,這時候就要用到基于防火墻標記的持久連接,通過定義端口的姻親關系來實現(xiàn)
yum install mod_ssl
兩個服務器上面都安裝一下
在REALSERVER1上面。也就是192.168.1.2上面如下操作
cd /etc/pki/tls/certs/make httpd.pem #此種SSL證書的生成方式只為測試,在實際操作中構建
SSL參見我博客前面的完整步驟
填寫相關信息,主機名稱一定要和VIP在互聯(lián)網(wǎng)上面解析的DNS名稱一致
cp httpd.pem /etc/httpd/vi /etc/httpd/conf.d/ssl.conf# 找到如下行啟用并且修改DocumentRoot "/var/www/html"ServerName www.test.org:443 #這里修改為你得服務器名稱# 修改證書路徑SSLCertificateFile /etc/httpd/httpd.pemSSLCertificateKeyFile /etc/httpd/httpd.pemscp httpd.pem 192.168.1.3:/etc/httpdscp /etc/httpd/conf.d/ssl.conf 192.168.1.3:/etc/httpd/conf.d/
防火墻添加mark
iptables -t mangle -A PREROUTING -d 192.168.0.1 -p tcp --dport 80 -j MARK --set-mark 10 (0-99范圍)iptables -t mangel -A PREROUTING -d 192.168.0.1 -p tcp --dport 443 -j MARK --set-mark 10ipvsadm -A -f 10 -s wlc -p 600ipvsadm -a -f 10 -r 192.168.1.2 -g -w 4ipvsadm -a -f 10 -r 192.168.1.3 -g -w 2
本文出自 “成長全記錄” 博客,請務必保留此出處http://lymrg.blog.51cto.com/1551327/684681
http://lymrg.blog.51cto.com/1551327/660925
VS/DR或VS/TUN應用的一種模型中(所有機器都在同一個物理網(wǎng)絡),所有機器(包括Director和RealServer)都使用了一個額外的IP地址,即VIP。
當一個客戶端向VIP發(fā)出一個連接請求時,此請求必須要連接至Director的VIP,而不能是RealServer的。因為,LVS的主要目標就是要Director負責調(diào)度這些連接請求至RealServer的。因此,在Client發(fā)出至VIP的連接請求后,只能由Director將其MAC地址響應給客戶端(也可能是直接與Director連接的路由設備),而Director則會相應的更新其ipvsadm table以追蹤此連接,而后將其轉發(fā)至后端的RealServer之一。
如果Client在請求建立至VIP的連接時由某RealServer響應了其請求,則Client會在其MAC table中建立起一個VIP至RealServer的對就關系,并以至進行后面的通信。此時,在Client看來只有一個RealServer而無法意識到其它服務器的存在。
為了解決此問題,可以通過在路由器上設置其轉發(fā)規(guī)則來實現(xiàn)(靜態(tài)的MAC-IP綁定)。當然,如果沒有權限訪問路由器并做出相應的設置,則只能通過傳統(tǒng)的本地方式來解決此問題了。這些方法包括:
傳統(tǒng)認為,解決ARP問題可以基于網(wǎng)絡接口,也可以基于主機來實現(xiàn)。Linux采用了基于主機的方式,因為其可以在大多場景中工作良好,但LVS卻并不屬于這些場景之一,因此,過去實現(xiàn)此功能相當麻煩?,F(xiàn)在可以通過設置arp_ignore,arp_announce,這變得相對簡單的多了。
Linux 2.2和2.4(2.4.26之前的版本)的內(nèi)核解決“ARP問題”的方法各不相同,且比較麻煩。幸運的是,2.4.26和2.6的內(nèi)核中引入了兩個新的調(diào)整ARP棧的標志(device flags):arp_announce和arp_ignore?;诖?,在DR/TUN的環(huán)境中,所有IPVS相關的設定均可使用arp_announce=2和arp_ignore=1/2/3來解決“ARP問題”了。以下是官方說明:
arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;0 - (default) Use any local address, configured on any interface.1 - Try to avoid local addresses that are not in the target's subnet for this interface. 2 - Always use the best local address for this target.arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.0 - (default): reply for any local target IP address, configured on any interface.1 - reply only if the target IP address is local address configured on the incoming interface.2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface.3 - do not reply for local address configured with scope host,only resolutions for golbal and link addresses are replied.4-7 - reserved8 - do not reply for all local addresses
定義了網(wǎng)卡在向外宣告自己的MAC-IP時候的限制級別,有三個值:
定義了網(wǎng)卡在響應外部ARP請求時候的響應級別,這里有8個值,但我們只使用了2個
在RealServers上,VIP配置在本地回環(huán)接口lo上。如果回應給Client的數(shù)據(jù)包路由到了eth0接口上,則arp通告或請應該通過eth0實現(xiàn),因此,需要在sysctl.conf文件中定義如下配置:
vim /etc/sysctl.confnet.ipv4.conf.eth0.arp_ignore = 1net.ipv4.conf.eth0.arp_announce = 2net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2
以上選項需要在啟用VIP之前進行,否則,則需要在Drector上清空arp表才能正常使用LVS。
到達Director的數(shù)據(jù)包首先會經(jīng)過PREROUTING,而后經(jīng)過路由發(fā)現(xiàn)其目標地址為本地某接口的地址,因此,接著就會將數(shù)據(jù)包發(fā)往INPUT(LOCAL_IN HOOK)。此時,正在運行內(nèi)核中的ipvs(始終監(jiān)控著LOCAL_IN HOOK)進程會發(fā)現(xiàn)此數(shù)據(jù)包請求的是一個集群服務,因為其目標地址是VIP。于是,此數(shù)據(jù)包的本來到達本機(Director)目標行程被改變?yōu)榻?jīng)由POSTROUTING HOOK發(fā)往RealServer。這種改變數(shù)據(jù)包正常行程的過程是根據(jù)IPVS表(由管理員通過ipvsadm定義)來實現(xiàn)的。
如果有多臺Realserver,在某些應用場景中,Director還需要基于“連接追蹤”實現(xiàn)將由同一個客戶機的請求始終發(fā)往其第一次被分配至的Realserver,以保證其請求的完整性等。其連接追蹤的功能由Hash table實現(xiàn)。Hash table的大小等屬性可通過下面的命令查看:
ipvsadm -Lcn
為了保證其時效性,Hash table中“連接追蹤”信息被定義了“生存時間”。LVS為記錄“連接超時”定義了三個計時器:
上面三個計時器的默認值可以由類似下面的命令修改,其后面的值依次對應于上述的三個計時器:
ipvsadm --set 28800 30 600
數(shù)據(jù)包在由Direcotr發(fā)往Realserver時,只有目標MAC地址發(fā)生了改變(變成了Realserver的MAC地址)。Realserver在接收到數(shù)據(jù)包后會根據(jù)本地路由表將數(shù)據(jù)包路由至本地回環(huán)設備,接著,監(jiān)聽于本地回環(huán)設備VIP上的服務則對進來的數(shù)據(jù)庫進行相應的處理,而后將處理結果回應至RIP,但數(shù)據(jù)包的原地址依然是VIP。
DIP要配置在接口上,VIP要配置在接口別名上
ifconfig eth0:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 uproute add -host $192.168.0.1 dev eth0:0 route add -host $192.168.1.1 dev eth0echo 1 >/proc/sys/net/ipv4/ip_forward
RIP要配置在接口上,VIP要配置在lo的別名上
定義內(nèi)核參數(shù),禁止響應對VIP的ARP廣播請求
echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignoreecho 1>/proc/sys/net/ipv4/conf/all/arp_ignoreecho 2>/proc/sys/net/ipv4/conf/lo/arp_announceecho 2>/proc/sys/net/ipv4/conf/all/arp_announce
配置VIP
ifconfig lo:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 uproute add -host 192.168.0.1 dev lo:0 # 確保如果請求的目標IP是$VIP,那么讓出去的數(shù)據(jù)包的源地址也顯示為$VIP
在前端服務器配置并啟動服務
ipvsadm -A -t 192.168.0.1:80 -s wlc ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -g -w 4 ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -g -w 2ipvsadm -L -nab -c -n 10000 http://192.168.0.1/index.html watch -n 1 'ipvsadm -L -n'