zoukankan      html  css  js  c++  java
  • LVS(五)LVS的持久连接

    什么是持久链接

    把某个客户端的请求始终定向到同一应用服务器上。对于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服务,然后使用持久连接方式保持回话。 

  • 相关阅读:
    解决一起web 页面被劫持的案例
    django rest framwork教程之外键关系和超链接
    django restframwork 教程之authentication权限
    Puppet nginx+passenger模式配置
    Django restframwork教程之类视图(class-based views)
    使用emplace操作
    C++中的显示类型转换
    整数加法
    在不知道学生人数和每个学生课程数量的情况下对学生的平均成绩排序
    树的高度
  • 原文地址:https://www.cnblogs.com/rexcheny/p/9751046.html
Copyright © 2011-2022 走看看