在實際生產環境中,每每須要根據業務應用場景來設置lvs的會話超時時間以及防session鏈接丟失的問題提,如在業務支付環節,如若session丟失會致使重複扣款問題,嚴重影響到安全性,本小節解將會講到關於lvs持久性鏈接問題web
一.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。session
2.一個鏈接建立後空閒時的超時時間,這個時間爲3種負載均衡
① tcp的空閒超時時間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,另外還須要根據鏈接類型,好比長鏈接和短鏈接,來設置相關超時時間,總之,根據應用場景來選擇!