lvs持久性工做原理和配置



做者: ISADBA|FH.CN 日期: 06/01/2012
轉載請註明:
做者:ISADBA.COM|FH.CN
BLOG:http://isadba.com
原文:http://isadba.com/?p=67
LVS持久鏈接技術

lvs的持久性鏈接有兩方面:

把同一個client的請求信息記錄到lvs的hash表裏,保存時間使用persistence_timeout控制,單位爲秒。
persistence_granularity 參數是配合persistence_timeout的,在某些狀況特別有用,他的值是子網掩碼,表示持久鏈接的粒度,默認是255.
255.255.255,也就是單獨的client ip
,若是改爲,255.255.255.0就是client ip一個網段的都會被分配到同一個real server。 一個鏈接建立後空閒時的超時時間,這個時間爲3種 tcp的空閒超時時間 lvs收到客戶端tcp fin的超時時間 udp的超時時間 如何查看這些值?
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 -Lcn IPVS connection entries pro expire state source virtual destination TCP 00:57 NONE 110.184.96.173:0 122.225.32.142:80 122.225.32.136:80 TCP 01:57 FIN_WAIT 110.184.96.173:54568 122.225.32.142:80 122.225.32.136:80

當一個client訪問vip的時候,ipvs或記錄一條狀態爲NONE的信息,expire初始值是persistence_timeout的值,而後根據時鐘主鍵變小,在如下記錄存在期間,同一client ip鏈接上來,都會被分配到同一個後端。 FIN_WAIT的值就是tcp tcpfin udp的超時時間,當NONE的值爲0時,若是FIN_WAIT還存在,那麼NONE的值會重新變成60秒,再減小,直到FIN_WAIT消失之後,NONE纔會消失,只要NONE存在,同一client的訪問,都會分配到統一real server。 如何設置這些值? persistence_timeout能夠經過如下兩種方法設置 ipvsadm -A -t 192.168.20.154:80 -s rr -p 60 注意:上面命令中紅色標記的80端口,表示同一客戶端訪問服務器的80端口,會被定義到同一個real server,若是把80端口改成0,那麼同一客戶端訪問服務器的任何服務都會被轉發到同一real server。 修改keepalived配置文件,在虛擬服務器配置下面加入persistence_timeout 60 tcp tcpfin udp的配置 ipvsadm –set tcp tcpfin udp # ipvsadm –set 120 50 50 //實例 建議:tcpfin的值最好小於persistence_timeout的值,這樣比較方便計算。



lvs持久性參考資料: http:
//www.linuxvirtualserver.org/docs/persistence.html lvs的持久鏈接 本文出自 「成長全記錄」 博客,請務必保留此出處http://lymrg.blog.51cto.com/1551327/684681 因爲HTTP是一種無狀態協議,每次請求完畢以後就當即斷開了,當用戶瀏覽購物網站挑選商品的時候,看到一件商品加入購物車,此過程被重定向到了REALSERVER1上面來,當把第二件商品加入購物車又被重定向到了REALSERVER2上面,最後結帳的時候在REALSERVER2上面,只有一件商品,這顯然是用戶沒法接受的,此時就須要一種持久鏈接機制,來把同一用戶的HTTP請求在超時時間內都重定向到同一臺REALSERVER,超時時間能夠本身定義,好比說2個小時,在超時時間內服務器會不斷追蹤用戶的訪問請求,把某一用戶的全部請求都轉發到同一臺REALSERVER上面,若是超時時間事後用戶依然在訪問,則默認按照每次兩分鐘的方式無限加長 這裏的全部操做都以DR模型爲例,試驗環境參見:http://lymrg.blog.51cto.com/1551327/660925 對於LVS的持久鏈接來講常見的分爲三種PCC,PPC和基於防火牆標記的持久鏈接,下面咱們就來分別討論 PCC PCC用來實現把某個用戶的全部訪問在超時時間內定向到同一臺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 -g ipvsadm -a -t 192.168.0.1:0 -r 192.168.1.3 -w 2 -g 此時測試一下會發現經過HTTP訪問VIP和經過SSH登陸VIP的時候都被定向到了同一臺REALSERVER上面了 PPC PPC用來把某個用戶對同一服務的訪問在超時時間內定向到同一臺REALSERVER ipvsadm -A -t 192.168.0.1:80 -s wlc -p 600 ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -w 4 -g ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -w 2 -g ipvsadm -A -t 192.168.0.1:22 -s wlc -p 300 ipvsadm -a -t 192.168.0.1:22 -r 192.168.1.2 -g ipvsadm -a -t 192.168.0.1:22 -r 192.168.1.3 -g 此時再測試會發現某個用戶在超時時間內對於某個服務的訪問都會被重定向到同一臺REALSERVER上面 防火牆標記 基於防火牆標記的持久鏈接 對於電子商務網站來講,用戶在挑選商品的時候使用的是80端口來瀏覽的,當付款的時候則是經過443的ssl加密的方式,固然當用戶挑選完商品付款的時候咱們固然不但願https的443跳轉到另一臺REALSERVER,很顯然應該是同一REALSERVER纔對,這時候就要用到基於防火牆標記的持久鏈接,經過定義端口的姻親關係來實現 首先兩個REALSERVER要配置SSL,很明顯證書應該也是同樣的 定義端口的姻親關係,給80和443端口打上一樣的防火牆標記 配置實現基於防火牆標記的LVS yum install mod_ssl 兩個服務器上面都安裝一下 在REALSERVER1上面。也就是192.168.1.2上面以下操做 cd /etc/pki/tls/certs/ make httpd.pem #此種SSL證書的生成方式只爲測試,在實際操做中構建 SSL參見我博客前面的完整步驟 填寫相關信息,主機名稱必定要和VIP在互聯網上面解析的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.pem SSLCertificateKeyFile /etc/httpd/httpd.pem scp httpd.pem 192.168.1.3:/etc/httpd scp /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 10 ipvsadm -A -f 10 -s wlc -p 600 ipvsadm -a -f 10 -r 192.168.1.2 -g -w 4 ipvsadm -a -f 10 -r 192.168.1.3 -g -w 2 本文出自 「成長全記錄」 博客,請務必保留此出處http://lymrg.blog.51cto.com/1551327/684681 關於arp_announce和arp_ignore http://lymrg.blog.51cto.com/1551327/660925 VS/DR或VS/TUN應用的一種模型中(全部機器都在同一個物理網絡),全部機器(包括Director和RealServer)都使用了一個額外的IP地址,即VIP。 當一個客戶端向VIP發出一個鏈接請求時,此請求必需要鏈接至Director的VIP,而不能是RealServer的。由於,LVS的主要目標就是要Director負責調度這些鏈接請求至RealServer的。所以,在Client發出至VIP的鏈接請求後,只能由Director將其MAC地址響應給客戶端(也多是直接與Director鏈接的路由設備),而Director則會相應的更新其ipvsadm table以追蹤此鏈接,然後將其轉發至後端的RealServer之一。 若是Client在請求創建至VIP的鏈接時由某RealServer響應了其請求,則Client會在其MAC table中創建起一個VIP至RealServer的對就關係,並以致進行後面的通訊。此時,在Client看來只有一個RealServer而沒法意識到其它服務器的存在。 爲了解決此問題,能夠經過在路由器上設置其轉發規則來實現(靜態的MAC-IP綁定)。固然,若是沒有權限訪問路由器並作出相應的設置,則只能經過傳統的本地方式來解決此問題了。 這些方法包括: 禁止RealServer響應對VIP的ARP請求; 在RealServer上隱藏VIP,以使得它們沒法獲知網絡上的ARP請求; 基於「透明代理(Transparent Proxy)」或者「fwmark (firewall mark)」; 禁止ARP請求發往RealServers; 傳統認爲,解決ARP問題能夠基於網絡接口,也能夠基於主機來實現。Linux採用了基於主機的方式,由於其能夠在大多場景中工做良好,但LVS卻並不屬於這些場景之一,所以,過去實現此功能至關麻煩。如今能夠經過設置arp_ignore,arp_announce,這變得相對簡單的多了。 Linux 2.2和2.42.4.26以前的版本)的內核解決「ARP問題」的方法各不相同,且比較麻煩。幸運的是,2.4.26和2.6的內核中引入了兩個新的調整ARP棧的標誌(device flags):arp_announce和arp_ignore。基於此,在DR/TUN的環境中,全部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 interface0 - (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 forthis target. arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address. 0 - (default): replyfor 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 - reserved 8 - do not reply for all local addresses

arp_announce 定義了網卡在向外宣告本身的MAC
-IP時候的限制級別,有三個值: 0:默認值,無論哪塊網卡接收到了ARP請求,只要發現本機有這個MAC都給與響應 1:儘可能避免響應ARP請求中MAC不是本網卡的,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就儘可能避免響應 2:老是使用最合適的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就必定不響應,只有發現請求的MAC是本身的纔給與響應

arp_ignore 定義了網卡在響應外部ARP請求時候的響應級別,這裏有8個值,但咱們只使用了2個
0:默認值,無論哪塊網卡接收到了ARP請求,只要發現本機有這個MAC都給與響應 1:老是使用最合適的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就必定不響應,只有發現請求的MAC是本身的纔給與響應在RealServers上,VIP配置在本地迴環接口lo上。若是迴應給Client的數據包路由到了eth0接口上,則arp通告或請應該經過eth0實現,所以,須要在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
以上選項須要在啓用VIP以前進行,不然,則須要在Drector上清空arp表才能正常使用LVS。 關於鏈接追蹤 到達Director的數據包首先會通過PREROUTING,然後通過路由發現其目標地址爲本地某接口的地址,所以,接着就會將數據包發往INPUT(LOCAL_IN HOOK)。此時,正在運行內核中的ipvs(始終監控着LOCAL_IN HOOK)進程會發現此數據包請求的是一個集羣服務,由於其目標地址是VIP。因而,此數據包的原本到達本機(Director)目標行程被改變爲經由POSTROUTING HOOK發往RealServer。這種改變數據包正常行程的過程是根據IPVS表(由管理員經過ipvsadm定義)來實現的。 若是有多臺Realserver,在某些應用場景中,Director還須要基於「鏈接追蹤」實現將由同一個客戶機的請求始終發往其第一次被分配至的Realserver,以保證其請求的完整性等。其鏈接追蹤的功能由Hash table實現。Hash table的大小等屬性可經過下面的命令查看: ipvsadm -Lcn 爲了保證其時效性,Hash table中「鏈接追蹤」信息被定義了「生存時間」。LVS爲記錄「鏈接超時」定義了三個計時器: 空閒TCP會話; 客戶端正常斷開鏈接後的TCP會話; 無鏈接的UDP數據包(記錄其兩次發送數據包的時間間隔); 上面三個計時器的默認值能夠由相似下面的命令修改,其後面的值依次對應於上述的三個計時器: ipvsadm --set 28800 30 600 數據包在由Direcotr發往Realserver時,只有目標MAC地址發生了改變(變成了Realserver的MAC地址)。Realserver在接收到數據包後會根據本地路由表將數據包路由至本地迴環設備,接着,監聽於本地迴環設備VIP上的服務則對進來的數據庫進行相應的處理,然後將處理結果迴應至RIP,但數據包的原地址依然是VIP。 DIP要配置在接口上,VIP要配置在接口別名上 在前端服務器上的配置(配置VIP) ifconfig eth0:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up route add -host $192.168.0.1 dev eth0:0 route add -host $192.168.1.1 dev eth0 echo 1 >/proc/sys/net/ipv4/ip_forward 在REALSERVER上面的配置 RIP要配置在接口上,VIP要配置在lo的別名上 定義內核參數,禁止響應對VIP的ARP廣播請求 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 配置VIP ifconfig lo:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up route add -host 192.168.0.1 dev lo:0 # 確保若是請求的目標IP是$VIP,那麼讓出去的數據包的源地址也顯示爲$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 2 ipvsadm -L -n ab -c -n 10000 http://192.168.0.1/index.html watch -n 1 'ipvsadm -L -n'
相關文章
相關標籤/搜索