LVS持久连接

来源:互联网 发布:python twisted 编辑:程序博客网 时间:2024/06/04 19:07

用户 跟服务器进行交互的时候会产生一个回话信息,叫做session。session的功能可以让服务器快速响应用户请求,记录用户行为等,但是如果是基于LVS的服务端,假如用户请求服务器在当前是由RS1提供,下一刻由RS2提供,那么RS1上的session就会失效,用户刚刚请求的行为还需要重新请求,这对于用户来说是极不方便的,因此企业尝试解决这个问题的办法大概有以下三种,一是做一个专门的session服务器,这样每个RS都可以从session服务器上共享这一会话信息;另一种则是session复制,即每个服务器产生的session都会复制给其他服务器,这样如果在大的站点,各RS是难以承受的;第三种解决方式是session绑定,LVS持久连接,即当用户请求LVS服务时,调度器会首先检查用户连接模板信息,查看是否有该用户的连接信息,如果有且处于长连接的时间范围内,则就会直接将该请求转发给模板上出现的RS。今天先总结LVS的持久连接。

LVS的持久连接一共分为三种方式:

a)PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS;

b)PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS; 

c)PFMC: 端口绑定,port affinity:基于防火墙标记,将两个或以上的端口绑定为同一个服务


其实在配置中,跟正常的LVS集群配置没有太大区别,另外持久连接的作用跟调度算法是没有任何关系的,即无论是何种调度算法,对持久连接的方式也是没有任何影响的。

如下:(假如架构图还是如上节的LVS-DR模型架构,即VIP:172.16.0.8,RS1:10.10.10.11,RS2:10.10.10.22)

我定义一个PPC的持久连接

# ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
//注意:如有只使用-p不指定长连接时间,则默认是300秒,单位为秒# ipvsadm -a -t 172.16.0.8:80 -r 10.10.10.11 -g# ipvsadm -a -t 172.16.0.8:80 -r 10.10.10.22 -g


这样在只要用户是在长连接的时间限制内访问集群服务的80端口,都会被绑定到同一个RS,如果我们定义的长连接时间用完了,如果LVS发现该用户还是处于活跃状态,则会在访问模板上为该用户默认添加两分钟的连接时长,直到用户不在响应,且两分钟之内都不在活跃,就会断开该连接。

现在定义一个PCC的持久连接,其实基本一样的

# ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120# ipvsadm -a -t 172.16.0.8:0 -r 10.10.10.11 -g# ipvsadm -a -t 172.16.0.8:0 -r 10.10.10.22 -g

也就是说,当我们将LVS服务的端口设置为0时,就是指所有端口,那这样的话,只要是同一个客户端访问这一协议的一系列端口,就一定会被转发到同一个RS上。这样看来,PCC的作用范围似乎太大了,PPC的作用范围似乎有优点小,因此有了第三种长连接办法,即PFMC基于防火墙标记的持久连接,简单的说就是将几个服务绑到一起,用防火墙给他们打个标签,以后但凡是这个标签来的请求,都被转发到同一个RS上,当然这是指在持久连接的有效时间内。


现在定义一个PFMC的持久连接(打算将集群服务的80(http)端口和443(https)端口做成防火墙标记为10的服务)

# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10# service iptables save# ipvsadm -A -f 10 -s wlc -p 120# ipvsadm -a -f 10 -r 10.10.10.11 -g -w 2# ipvsadm -a -f 10 -r 10.10.10.22 -g -w 1


因此防火墙标记的方法大概如下:

防火墙标记:
# iptables -t mangle -A PREROUTING -d VIP -p tcp --dport CS_Port -j MARK --set-mark #  (0-99)

定义集群服务:
# ipvsadm -A -f # 

0 0