什么是持久链接
把某个客户端的请求始终定向到同一应用服务器上。对于LVS来说持久连接和算法没有关系。也就是使用任何算法LVS都可以实现同一客户端的请求转发到之前选定的应用服务器,以保持会话。而且还能实现同一客户端的不同请求都可以定向到同一应用服务器,比如集群中2台应用服务器,每个应用服务器都提供WEB服务和TELNET服务,那么只要客户端一样,即使它两次请求不同服务,也可以定向到同一应用服务器上。
所以LVS支持2中模式
- PPC:持续端口连接,将来自同一客户端对同一服务定向到同一应用服务器上
- PCC:持续客户端连接,将来自同一客户端对所有服务定向到同一应用服务器上
- PNMPP:持久防火墙标记连接
LVS会在自己的内存缓冲区内维护一个持久连接表,每一个客户端以及为其分配的应用服务器都有一个对应关系,前提是没有会话没有超时。LVS本身有查看持久连接的命令。
Ipvsadm –L –persistent-conn # 显示持久连接 ipvsadm –L –c # 显示持久连接表
对于LVS来说启用持久连接就是在建立集群服务的时候制定-P参数,也就超时时长,默认300秒。
Ipvsadm –A|E…… -P
在基于SSL的会话中,通常都会用到持久连接,因为在建立连接的时候双发需要进行认证、加密等等,如果会话不能维持,那就会出现一刷新就去协商,这样很浪费资源而且效率低下。
设置默认持久连接
我们测算持久连接,我们先把算法改成RR,这样是轮训的,比较好看出效果:
这样浏览器没刷新一次就会变换一次WEB服务
设置持久连接,使用-p参数的默认值,默认是360秒,这样在360秒内,怎么刷新都是同一个应用服务器。即便是同一主机的不同浏览器也是一样。
因为同一主机都定向到同一服务器,所以它的非活动链接就比较大。
设置同一主机发起的不同服务请求持久连接(PPC模式,同端口保持持久)
我们这里使用WEB和TELNET,80端口目前就有,然后我们在应用服务器上启动TELNET服务,也就是23号端口。
在Linux上是不允许root账号TELNET上来的,所以要测试Telnet连接需要单独建立账号,就是普通的账号就行。
在2台应用服务器上都进行安装:
启动服务
在每台应用服务器上建立一个用户,过程略。测试TELNET如下:
再建立一个集群服务针对23号端口,如下:
连接测试,打开2个终端
这时候TELENT都定向到同一服务器,虽然打开了不同的终端。下面我们同时在访问以下WEB,如下
可以看到,这就是PPC模式,也就是同一主机的访问不同服务,都定位到相同主机上。在超时时长内,你访问80端口永远都会是定向到同一主机,访问23也一样,不同服务定的主机可能会不相同,但是同一服务定向的主机肯定相同。
如果要实现不管是否是相同服务,只要是来自同一主机的,在超时时长内都定向到同一应用服务器,这就是PCC模式。
设置同一主机发起的不同服务请求持久连接(PCC模式,同客户端保持持久)
PCC模式的原理就是,无论用户请求哪个服务端口,都向应用服务器转发,说白了就是它只看客户端IP,不看客户端访问端口,只要IP是同一个,就向之前选定的应用服务器转发,如果它请求的端口在应用服务器上没有,那就报错了,这个报错就是找不到服务,也并不是说严重的错误。
我们使用ipvsadm –C清除所有集群服务,然后重新建立。
我们看到端口设定的是0,其实就是意味着所有端口,当你设定端口是0的时候,就必须制定-p参数。其实是否是PCC还是PPC模式关键就是看集群服务设置的是0端口还是特定端口。我们再来测试一下:
这时候我们看到无论只要第一次访问定位到一个主机,那么在超时时长内,无论放访问什么服务都会定向到同一主机。
PCC可以把同一主机的不同服务都定向到同一应用服务器,但是这要允许所有端口请求,如果我想实现指定的某几个端口服务而不是全部端口,那该如何实现?那就只能是把不同端口绑定到同一集群服务,这就要用防火墙标记功能。
设置指定端口的来自同一主机定向到同一应用服务器(PNMPP,持久防火墙标记)
在防火墙的PREROUTING链上定义端口标记,比如把80、23等等都设置为同一个标记,然后在集群服务上很对标记来做。
如何定义标记呢?清空现有额IPVS规则:
设置防火墙的PREROUTING规则:
意思是 –t 指定为mangle表;-A 添加在PREROUTING链上(刚进入的时候就需要打标记,这是IPTABLES的4个链条中的第一个);-d 目标地址(VIP);-I eth0 设定流入网卡,也可以不设置;-p tcp设置为TCP协议;--dport 80是指定80端口;-j MARK 打标记;--set-mark 10标记号为10(任何一个没有被占用的)。
创建集群服务
注意我这里还没有设置持久连接,因为没有加-p参数。-f 10是指定防火墙标记为10的,这个在上面IPTABLES中已经配置了。
添加应用服务器
配置好以后,你可以通过80访问网页,也可以通过TELNET登录。如果要用持久连接,就直接加-p参数。这里我修改一下,还是防火墙标记10,这里设置了持久连接时长-p,默认360秒。
访问测试:130就是WEB2
注意:在生产环境中80一般和443绑定一起,所以就用防火墙标记。 虽然使用持久连接会破坏负载均衡,但是对于WEB这种服务尤其是电商、论坛、博客、微博等等网站必须使用,否则会话就中断了。
总结
虽然LVS可以做持久连接但是通常我们也不这样来做,一般都是用缓存服务器来保存用户的会话。下面用一个非常简单结构来说明
上面是一个论坛架构,通过LVS做负载均衡,同时为了不增加LVS的负担不开启连接持久化功能,但是为了保证用户会话的一致性,使用了Memcached缓存服务器,PHP可以将用户的会话信息保存在Memcached服务器上,无论有多少WEB前端服务器,都可以去Memcached服务器上去获取用户会话信息。这样就实现了会话的一致和共享。Memcached本身不是服务,它是一个编程API。
因为是多个WEB前端服务器,网站更新页面是正常的,为了批量快速更新页面文件,就需要一种文件同步机制,因为这些页面文件都保存在WEB服务器本地,所以就使用Sersync(C/S结构)来完成,WEB服务器安装客户端,当它们收到inotify通知以后就去服务器上拉取文件进行更新。
用户上传的附件这些事不能保存在数据库上的,所以使用文件服务器来存放。
对于电商网站来说,80和443绑定在一起,因为付款的时候都会用到443安全连接上。但是虽然80和433都页面,但是他们是不同服务,所以还要用LVS持久连接,无论是否用了会话共享,如果付款的时候可以把这些信息抽取出来转移到一个新的服务上去,而不是WEB服务,那就是另外一回事。上面这种场景如果用443,那么所有WEB服务器都要绑定证书,他们使用同一个证书就行,因为对外域名一样。
小作业:在WEB服务器上开启80和433服务,然后使用持久连接方式保持回话。
原文地址:https://www.cnblogs.com/yunxizhujing/p/9751046.html