LVS持久化
Posted 萝卜1992
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS持久化相关的知识,希望对你有一定的参考价值。
在实际应用场景中,轮询调度并不都是适用的。有些情况下,需要我们把同一个会话的请求都调度给一个RS节点。这时候就需要LVS提供持久化的能力,能够实现会话保持。
一、LVS的持久化主要包括以下两个方面。
1. 把来自同一个客户端IP的请求转发到同一个RS的持久化时间:persistence_timeout。通过这个持久化时间,我们可以实现会话保持。
2. 一个连接创建后处于空闲状态的超时时间。包括三种:
- tcp连接的空闲超时时间
- LVS收到客户端FIN消息的超时时间
- udp的超时时间
二、持久化时间的机制
[[email protected] ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:28 FIN_WAIT 192.31.56.1:52176 192.31.56.105:80 192.168.100.35:80
TCP 05:34 NONE 192.31.56.1:0 192.31.56.105:80 192.168.100.35:80
当客户端的请求到达LB后,IPVS会在记录表里添加一条state为NONE的连接记录。该连接记录的源IP为客户端IP,端口为0,超时时间为上面所说的持久化时间persistence_timeout,会逐步减小。如果后续同一客户端IP的消息过来,该状态为NONE的连接记录还在,那么persistence_timeout会被刷新为初始值。
FIN_WAIT前面的超时时间就是tcp|tcpfin|udp中的tcpfin的值。在IPVS记录的每一条连接中,如果客户端发起了FIN断连,则IPVS中记录的连接状态会从ESTABLISH变为FIN_WAIT。当NONE的超时时间减到0时,如果IPVS记录中还存在FIN_WAIT状态的连接,则persistence_timeout值会刷新为初始值。
在该NONE状态的连接记录存在的期间,同一客户端IP的消息都会被调度到同一个RS节点。
(NONE状态连接不是表示一条具体的连接,而是代表一个客户端IP过来的连接的模板,源端口用0表示。具体的连接会在IPVS上记录具体的连接状态,会显示具体的源端口)
三、持久化时间的配置
示例:
- 配置持久化时长为360秒
ipvsadm -A -t 192.168.1.100:80 -s rr -p 360
ipvsadm -Ln 查看配置
#ipvsadm -Ln
IP Virtual Server version x.x.x (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 99 rr persistent 360
IP Virtual Server version x.x.x (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 99 rr persistent 360
- 配置tcp/tcpfin/udp超时时间
ipvsadm --set 300 60 100
表示tcp空闲等待超时时间为300秒;客户端
ipvsadm -Ln --timeout查看配置
Timeout (tcp tcpfin udp): 900 120 300
四、 持久化分类
当配置了LVS持久化的时候,IPVS在内部使用一个称之为“持久连接模板”的连接跟踪记录来确保所有来自同一个客户端的请求被分发到同一台Real Server上。
说明:持久连接模板是指每一个客户端 及分配给它的RS的映射关系。
常见的持久化方式有以下三种:
1. 端口连接持久化(Persistent Port Connections):将同一个客户端IP对于某个虚拟服务IP端口的请求,都调度给同一个真实服务器。
不足:访问不同的虚拟服务端口时,无法保证调度到同一个服务器。
配置方法:
ipvsadm -A -t 192.168.1.100:80 -s rr -p 3600(添加一个VS,轮询,持久化时长1小时)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.23 -g -w 1(DR模式,添加一个RS)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.24 -g -w 1(DR模式,添加一个RS)
2. 客户端连接持久化(Persistent Client Connections):将同一个客户端IP对于虚拟服务节点所有的请求,都调度到同一个真实服务器。
不足:只能配置一组资源池,且同一个客户端IP的请求只能访问同一个真是服务器。
配置方法:
ipvsadm -A -t 192.168.1.100:0 -s rr -p 3600
ipvsadm -a -t 192.168.1.100:0 -r 192.168.1.23 -g -w 1
ipvsadm -a -t 192.168.1.100:0 -r 192.168.1.24 -g -w 1
3. 防火墙标记持久化:将带有同一标记的数据包都调度给同一台真实服务器(相当于按标记做持久化,可用于实现跨虚拟服务的关联持久化)
比如LVS同时提供一个http端口80和https端口443的虚拟服务,需要将这两个虚拟服务实现关联持久化。(比如:一个用户在访问购物网站时同时使用http(80)和https(443)两种协议,http服务用于浏览页面,https服务用于加密传输密码等重要信息,这时我们需要将用户的请求调度到同一台Real Server上)
配置方法:(如要实现80端口和443端口的会话保持)
iptables -t mangle -A PREROUTING -d 192.168.1.100 -i eth0 -p tcp --dport 80 -j MARK --set-mark -10(给访问虚拟服务192.168.1.100:80的数据包都加上标记10)
iptables -t mangle -A PREROUTING -d 192.168.1.100 -i eth0 -p tcp --dport 443 -j MARK --set-mark -10(给访问虚拟服务192.168.1.100:443的数据包都加上标记10)
ipvsadm -A -f 10 -s rr -p 3600(增加一个标记为10的虚拟服务,轮询,时长1小时)
ivpsadm -a -f 10 -r 192.168.1.23 -g -w 1(增加标记为10的真实服务器)
ivpsadm -a -f 10 -r 192.168.1.24 -g -w 1(增加标记为10的真实服务器)
注意:这里的标记都是指LB节点上iptables在mangle表上添加的标记规则。PREROUTING指路由前的操作。所以当客户端的请求到达虚拟服务80端口时,首先iptables会给数据包打上标记10,然后调度给RS1(标记是内核模块上的记录,不会跟随数据包出去,RS1收到的数据包和普通数据包没有差别,并不会有标记);然后该客户端的请求到达虚拟服务443端口,iptables也会给数据包打上标记10,然后内核模块调度时,能够查询到80端口的调度记录中也有标记为10的连接,这时候就会把访问443端口的请求调度给同一个RS1。从而实现了从http服务到https服务的会话保持。
以上是关于LVS持久化的主要内容,如果未能解决你的问题,请参考以下文章