在实际生产环境中,每每须要根据业务应用场景来设置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,另外还须要根据链接类型,好比长链接和短链接,来设置相关超时时间,总之,根据应用场景来选择!