在實際生產環境中,往往需要根據業務應用場景來設置lvs的會話超時時間以及防session連接丟失的問題提,如在業務支付環節,如若session丟失會導致重復扣款問題,嚴重影響到安全性,本小節解將會講到關於lvs持久性連接問題
一.lvs負載均衡持久連接介紹:
引子(案例)
對於電子商務網站來說,用戶在挑選商品的時候使用的是80端口來瀏覽的,當付款的時候則是通過443的ssl加密的方式,當然當用戶挑選完商品付款 的時候,我們當然不希望https的443跳轉到另外一台REAL SERVER上,很顯然應該是同一REAL SERVER才對,這時候就要用到基於防火牆標記的持久連接,通過定義端口的姻親關系來實現。在生產環境中用的最多的也是PNMP即基於防火牆標記的持久 連接。好了引子就說到這下面我們就來詳細說說LVS的持久連接……
(1)lvs的持久性連接有兩方面:
1.把同一個client的請求信息記錄到lvs的hash表里,保存時間使用persistence_timeout控制,單位為秒。 persistence_granularity 參數是配合persistence_timeout的,在某些情況特別有用,他的值是子網掩碼,表示持久連接的粒度,默認是 255.255.255.255,也就是單獨的client ip,如果改成,255.255.255.0就是client ip一個網段的都會被分配到同一個real server。
2.一個連接創建后空閑時的超時時間,這個時間為3種
① tcp的空閑超時時間
② lvs收到客戶端tcp fin的超時時間
③ udp的超時時間
(2)lvs相關超時時間查看:
1.通過"ipvsadm -Ln"可以查看persistence_timeout 超時時間(默認超時時間360s)
[root@cn-sh-sq-web01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.51.96.105:80 rr persistent 360
-> 192.168.0.235:80 Tunnel 1 0 0
-> 192.168.0.236:80 Tunnel 1 0 0
2.通過"ipvsadm -Ln --timeout"可以查看tcp tcpfin udp的超時時間(默認:900 120 300)
[root@cn-sh-sq-web01 ~]# ipvsadm -Ln --timeout
Timeout (tcp tcpfin udp): 900 120 300
(3)lvs是如何控制這些超時時間工作
[root@cn-sh-sq-web01 ~]# ipvsadm -Ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:59 FIN_WAIT 172.51.96.1:54196 172.51.96.105:80 192.168.0.235:80
TCP 05:54 NONE 172.51.96.1:0 172.51.96.105:80 192.168.0.235:80
當一個client訪問vip的時候,這時ipvs就會記錄一條狀態為NONE的信息,如述上所示,expire初始值為:persistence_timeout的值,然后根據時鍾主鍵變小,在以下記錄存在期間,同一client ip連接上來,都會被分配到同一個后端。
FIN_WAIT的值就是tcp tcpfin udp的中tcpfin的超時時間,當NONE的值為0時,如果FIN_WAIT還存在,那么NONE的值會從新變成persistence_timeout的值,再減少,直到FIN_WAIT消失以后,NONE才會消失,只要NONE存在,同一client的訪問,都會分配到統一real server。
(4)lvs關於相關超時時間的設置
1. persistence_timeout 可以通過"ipvsadm -p timeout" 來設置,默認360秒
ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中紅色標記的80端口,表示同一客戶端訪問服務器的80端口,會被定義到同一個real server,如果把80端口改為0,那么同一客戶端訪問服務器的任何服務都會被轉發到同一real server。
修改keepalived配置文件,在虛擬服務器配置下面加入persistence_timeout 60
2. tcp tcpfin udp 可以通過"ipvsadm --set 對應超時時間"來設置
ipvsadm --set tcp tcpfin udp
建議:tcpfin的值最好小於persistence_timeout的值,這樣比較方便計算,也有利於tcpfin回收
(5)持久連接定義與原理
1.定義
持久連接是指無論使用什么算法,LVS持久都能實現在一定時間內,將來自同一個客戶端請求派發至此前選定的RS。
2.原理
當使用LVS持久性的時候,Director在內部使用一個連接根據記錄稱之為“持久連接模板”來確保所有來自同一個客戶端的請求被分發到同一台Real Server上。
說明:持久連接模板是指每一個客戶端 及分配給它的RS的映射關系;
3.持久連接分類
(1).持久端口連接,簡稱PPC(Persistent Port Connections):將來自於同一個客戶端對同一個集群某個服務的請求,始終定向至此前選定的RS;
例如:client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2
缺陷:期望訪問不同的端口到同一台RS上,無法實現。
配置:
ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600 ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2 ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
(2).持久客戶端連接,簡稱PCC(Persistent Client Connections):將來自於同一個客戶端對所有端口的請求,始終定向至此前選定的RS;
說明:PCC是一個虛擬服務沒有端口號(或者端口號為0),以"-p" 來標識服務。
缺陷:定向所有服務,期望訪問不同的Real Server無法實現。
配置:
ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600 ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2 ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
(3).PNMPP(Persistent Netfilter Marked Packet Persistence):,基於防火牆設置端口綁定的持久連接,例如后台realserver同時提供80和443端口的服務,並且兩個服務之間有聯系,這時就要用到PNMPC。
先對某一特定類型的數據包打上標記,然后再將基於某一類標記的服務送到后台的Real Server上去,后台的Real Server 並不識別這些標記。將持久和防火牆標記結合起來就能夠實現端口姻親功能,只要是來自某一客戶端的對某一特定服務(需要不同的端口)的訪問都定義到同一台 Real Server上去。
案例:一個用戶在訪問購物網站時同時使用HTTP(80)和HTTPS(443)兩種協議,我們需要將其定義到同一台Real Server上,而其他的服務不受限制。
配置:
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8 iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8 ipvsadm -A -f 8 -s rr -p 600 ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2 ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
總結:關於lvs持久性連接需要根據業務場景來選擇,比如電商平台,對應的持久性連接應該是PNMPP,另外還需要根據連接類型,比如長連接和短連接,來設置相關超時時間,總之,根據應用場景來選擇!