前面在讨论LVS算法中,SH算法可以实现将同一客户端的请求总是发送给第一次指定的RS,除非该RS出现故障不能再提供服务。其实在LVS集群中,持久连接功能也能在一定时间内,将来自同一个客户端请求派发至此前选定的RS,而且是无关算法的。
持久连接的三种类型:
在基于SSL的加密https协议中,特别需要用到持久连接,因为客户端需要与服务器进行交换证书并协商加密算法等。
如果一个集群中提供了两种服务,持久连接会将同一客户端的所有请求都同步到同一RS。持久连接分三种:
- PPC(持久端口连接):将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;
- PCC(持久客户端连接):将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;PCC是把所有端口统统定义为集群服务,一律向RS转发;
- PNMPP:持久防火墙标记连接。使用iptables的标记功能,可以实现给多个服务(端口)打上相同的标记,然后在ipvsadm使用-f选项,并使用上述防火墙标记即可将多个服务放到一个LVS集群中。实现过程如下:
# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 80 -i $INCARD -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 443 -i $INCARD -j MARK --set-mark 10# ipvsadm -A -f 10 -s wlc –p 600
持久连接模板查看:
LVS的持久连接又集群的持久连接模板(一个内存缓冲区)提供;该持久连接模板保存着每一个客户端及分配给它的RS的映射关系。使用如下命令可以查看该模板:
[root@lvs ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 192.168.8.12:51822 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51825 172.16.1.253:http 172.16.1.101:http
TCP 01:56 FIN_WAIT 192.168.8.12:51821 172.16.1.253:http 172.16.1.101:http
TCP 01:42 FIN_WAIT 192.168.8.12:51814 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51826 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51824 172.16.1.253:http 172.16.1.102:http
TCP 01:56 FIN_WAIT 192.168.8.12:51820 172.16.1.253:http 172.16.1.102:http
TCP 14:58 ESTABLISHED 192.168.8.12:51828 172.16.1.253:http 172.16.1.102:http
TCP 01:55 FIN_WAIT 192.168.8.12:51815 172.16.1.253:http 172.16.1.101:http
TCP 01:56 FIN_WAIT 192.168.8.12:51823 172.16.1.253:http 172.16.1.101:http
TCP 01:57 FIN_WAIT 192.168.8.12:51827 172.16.1.253:http 172.16.1.101:http
配置并启用lvs集群的持久连接:
基本语法:
ipvsadm -A|E ... -p timeout
timeout: 持久连接时长,默认300秒;单位是秒;
在使用《LVS之四:DR模型实现》中的lvs集群,每次刷新客户端时,都会在RS1和RS2上切换。如下图:
我们启用持久连接:
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.253:80 wlc
-> 172.16.1.101:80 Route 5 0 1
-> 172.16.1.102:80 Route 5 0 2
[root@lvs ~]# ipvsadm -E -t 172.16.1.253:80 -p 600
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.253:80 wlc persistent 600
-> 172.16.1.101:80 Route 5 0 0
-> 172.16.1.102:80 Route 5 0 1
此时再次刷新客户端,会发现已经不会再改变RS。
[root@lvs ~]# ipvsadm -L --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 172.16.1.253:http wlc persistent 600
-> 172.16.1.101:http 5 0 0 0
-> 172.16.1.102:http 5 1 0 14