之前简单介绍LVS负载均衡的高可用方案实施,下面详细说明LVS的session解决方案:

LVS算法中,SH算法可以实现将同一客户端的请求总是发送给第一次指定的RS,除非该RS出现故障不能再提供服务。其实在LVS集群中,持久连接功能也能在一定时间内,将来自同一个客户端请求派发至此前选定的RS,而且是无关算法的。
持久连接是什么?
1)在LVS中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器。
2)为什么会用到持久连接?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.1)cookie/session机制的简单说明:
在Web服务通信中,HTTP本身是无状态协议,不能标识用户来源,此时出现了一个问题,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,
那么用户之前的登陆的信息就都丢失了!为了记录用户的会话信息,开发者就在客户端/服务器端软件提供了cookie/session机制,当用户访问网站时,服务器端建立一个session会
话区,并建立一个cookie与这个session绑定,将信息发送给用户的浏览器。这样,只要用户的cookie存在,服务器端的session存在,那么当用户打开新页面的时候,服务器依然会
认识用户!<br>
2.2)cookie/session由负载均衡导致的问题:
上面说服务器需要靠session/cookie来标记用户的会话,这没什么问题。不过,当用户在做了负载均衡的时候,就出现了问题。
我们依然假设一个场景:某电商网站为了实现更多用户的访问,提供了A、B两台服务器,并在前面做了LVS负载均衡。于是某用户打开了某购物网站,选中了一件衣服,并加入了购物
车(此时背后的操作是:LVS负载均衡器接受了用户请求,并将其分发到了选中的服务器,并将用户添加了一件衣服记录到这个会话的session中)。这时当用户打开了第二个网页,又
选中了一件帽子并加入购物车(此时背后的操作是:LVS负载均衡器接受了用户请求,进行计算,将其发送到选中的服务器上,该服务器将用户添加了一件帽子记录到session中)。
到现在可能各位已经发现问题了,由于LVS是一个四层负载均衡器,仅能根据IP:Port对数据报文进行分发,不能确保将同一用户根据session发往同一个服务器,也就是用户第一次被
分配到了A服务器,而第二次可能分配到了B服务器,但是B服务器并没有A服务器用户的session记录,直接导致这个例子里的用户发现自己的购物车没有了之前的衣服,而仅有帽子。这是不可接受的。
为了避免上面的问题,生产环境中一般有三种方案:
  2.2.1)将来自于同一个用户的请求发往同一个服务器
  2.2.2)将session信息在服务器集群内共享,每个服务器都保存整个集群的session信息
  2.2.3)建立一个session存储池,所有session信息都保存到存储池中
显然,第一种方案是最简单,也是最节约资源的,而持久连接和sh算法就是实现第一种方案的两种方式。

3)LVS的sh算法和持久连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
sh算法全称为source hash(源地址hash),它和持久连接的作用都是"将来自同一个IP的请求都转发到同一个Server",从而保证了session会话定位的问题。两者的不同是:
3.1)sh算法:使用SH算法,SH算法在内核中会自动维护一个哈希表,此哈希表中用每一个请求的源IP地址经过哈希计算得出的值作为键,把请求所到达的RS的地址作为值。
在后面的请求中,每一个请求会先经过此哈希表,如果请求在此哈希表中有键值,那么直接定向至特定RS,如没有,则会新生成一个键值,以便后续请求的定向。但是此种
方法在时间的记录上比较模糊(依据TCP的连接时长计算),而且其是算法本身,所以无法与算法分离,并不是特别理想的方法。
3.2)持久连接:此种方法实现了无论使用哪一种调度方法,持久连接功能都能保证在指定时间范围之内,来自于同一个IP的请求将始终被定向至同一个RS,还可以把多种
服务绑定后统一进行调度。
详细一点说:当用户请求到达director时。无论使用什么调度方法,都可以实现对同一个服务的请求在指定时间范围内始终定向为同一个RS。在director内有一个LVS持久
连接模板,模板中记录了每一个请求的来源、调度至的RS、维护时长等等,所以,在新的请求进入时,首先在此模板中检查是否有记录(有内置的时间限制,比如限制是
300秒,当在到达300秒时依然有用户访问,那么持久连接模板就会将时间增加两分钟,再计数,依次类推,每次只延长2分钟),如果该记录未超时,则使用该记录所指向
的RS,如果是超时记录或者是新请求,则会根据调度算法先调度至特定RS,再将调度的记录添加至此表中。这并不与SH算法冲突,lvs持久连接会在新请求达到时,检查
后端RS的负载状况,这就是比较精细的调度和会话保持方法。

4)LVS的三种持久连接方式:

1
2
3
4
5
6
7
在基于SSL的加密https协议中,特别需要用到持久连接,因为客户端需要与服务器进行交换证书并协商加密算法等。
如果一个集群中提供了两种服务,持久连接会将同一客户端的所有请求都同步到同一RS。持久连接分三种:
4.1)PCC(持久端口连接):每客户端持久;将来自于同一个客户端的所有请求统统定向至此前选定的RS;也就是只要IP相同,分配的服务器始终相同。<br>
4.2)PPC(持久客户端连接):每端口持久;将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的RS。例如:来自同一个IP的用户第一次访问
集群的80端口分配到A服务器,25号端口分配到B服务器。当之后这个用户继续访问80端口仍然分配到A服务器,25号端口仍然分配到B服务器。<br>
4.3)PFMC:持久防火墙标记连接;将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS;不过它可以将两个毫不相干的端口定义为一个集群服务,
例如:合并http的80端口和https的443端口定义为同一个集群服务,当用户第一次访问80端口分配到A服务器,第二次访问443端口时仍然分配到A服务器。

5)定义LVS持久连接:
LVS的持久连接功能需要定义在集群服务上面,使用-p timeout选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
5.1)定义PPC:
[root@localhost ~]# ipvsadm -At 192.168.10:80 -s rr -p 300
上面命令的意思是:添加一个集群服务为192.168.10:80,使用的调度算法为rr,持久连接的保持时间是300秒。当超过300秒都没有请求时,则清空LVS的持久连接模板。
5.2)定义PCC:
[root@localhost ~]# ipvsadm -A -t 192.168.10.200:0 -s rr -p 600
[root@localhost ~]# ipvsadm -a -t 192.168.10.200:0 -r 192.168.1.10 -g -w 2
[root@localhost ~]# ipvsadm -a -t 192.168.10.200:0 -r 192.168.1.20 -g -w 1
5.3)定义PFMC:
######PNMPP是通过路由前给数据包打标记来实现的
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.10.200 -eth0 -p tcp --dport 80 -j MARK --set-mark 3
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.10.200 -eth0 -p tcp --dport 443 -j MARK --set-mark 3
[root@localhost ~]# ipvsadm -A -f 3 -s rr -p 600
[root@localhost ~]# ipvsadm -a -f 3 -r 192.168.1.10 -g -w 2
[root@localhost ~]# ipvsadm -a -f 3 -r 192.168.1.20 -g -w 2

6)持久连接模板查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
LVS的持久连接又集群的持久连接模板(一个内存缓冲区)提供;该持久连接模板保存着每一个客户端及分配给它的RS的映射关系。使用如下命令可以查看该模板:
[root@localhost ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 192.168.10.200:51822 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.10.200:51825 172.16.1.253:http 172.16.1.101:http
TCP 01:56 FIN_WAIT 192.168.10.200:51821 172.16.1.253:http 172.16.1.101:http
配置并启用lvs集群的持久连接:
基本语法:
# ipvsadm -A|E ... -p timeout
timeout: 持久连接时长,默认300秒;单位是秒;
启用持久连接:
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.253:80 wlc
-> 172.16.1.101:80 Route 5 0 1
-> 172.16.1.102:80 Route 5 0 2
[root@localhost ~]# ipvsadm -E -t 172.16.1.253:80 -p 600
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.253:80 wlc persistent 600
-> 172.16.1.101:80 Route 5 0 0
-> 172.16.1.102:80 Route 5 0 1
此时再次刷新客户端,会发现已经不会再改变RS。
[root@localhost ~]# ipvsadm -L --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 172.16.1.253:http wlc persistent 600
-> 172.16.1.101:http 5 0 0 0
-> 172.16.1.102:http 5 1 0 14

转载于:https://www.cnblogs.com/cheyunhua/p/8034227.html

LVS负载均衡下session共享的实现方式-持久化连接相关推荐

  1. 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离

    写这篇文章花费了我近一周的时间,参考网上许多优秀的博客文章,我不敢说写的很好,至少很全很详细.本文先介绍原理部分,然后再进行实战操作,我认为这样才会有更深的理解,不过这也导致了文章篇幅很长.但是,如果 ...

  2. nginx+tomcat+redis负载均衡及session共享

    概述 本文档是用来详细描述 nginx+tomcat+redis负载均衡实现session共享 所需软件及下载地址 软件名称 下载地址 功能说明 Nginx-v1.6.0 http://nginx.o ...

  3. Nginx+Tomcat+Redis负载均衡实现Session共享

    Nginx+Tomcat+Redis负载均衡实现Session共享 环境描述 tomcat1:192.168.194.100:18080 tomcat2:192.168.194.100:28080 N ...

  4. 解决nginx负载均衡的session共享问题

    之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx session共享问题,查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享服务器有多台,用ngi ...

  5. Nginx负载均衡+tomcat+session共享

    为什么80%的码农都做不了架构师?>>>    本文,是笔者工作之余写的,第一是把之前打系统框架的步骤记录下来.第二是将这个过程,谈不上经验,奉献给正在撘这种框架遇到各种bug,各种 ...

  6. nginx负载均衡的session共享问题的解决方法

    查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享 PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session ...

  7. nginx+tomcat+memcache实现负载均衡、session共享

    实验架构图: Table of Contents 1.配置tomcat 2.安装memcache 3.查看tomcat和memcache是否配置好 4.nginx实现负载均衡: 5.客户端进行测试: ...

  8. nginx和tomcat实现反向代理、负载均衡和session共享

    这类的文章非常多,nginx和tomcat实现反向代理.负载均衡实现非常easy,能够參照http://blog.csdn.net/liuzhigang1237/article/details/888 ...

  9. Nginx+MSM+Tomcat做负载均衡,session共享

    2019独角兽企业重金招聘Python工程师标准>>> 先上个架构图(个人理解是这个样子) 简单来说:服务器A上面部署一个Nginx反向代理服务器,MSM用于session共享,To ...

最新文章

  1. oracle Ratio_to_report的用法
  2. python中get和set使用_Python中的__get__与__set__
  3. Android-获取窗口的宽度与高度
  4. 小分子php蛋白,如何研究小分子抑制蛋白降解途径? - 分子生物 - 小木虫 - 学术 科研 互动社区...
  5. 2022张宇考研基础30讲 第十讲 积分等式与积分不等式
  6. NGINX集群+KeepLived实现高可用
  7. 国产管理软件勒索病毒大爆发
  8. OpenCV之模板匹配
  9. SSD目标检测算法生成8732个先验框
  10. 利用PE安装ISO镜像(以及精简版镜像)/安装忍术渗透系统
  11. MP40N120-ASEMI场效应管MP40N120
  12. 基于PostgreSQL的时区问题解决
  13. AE基础教程(1)——第1章 影视后期专业导论
  14. 微信加入群聊的测试设计点
  15. 近期必读的12篇「推荐系统」相关论文
  16. SAP中WM仓库管理中关于仓储单位SU的应用理解
  17. 10.13、驱动开发 -- spi总线
  18. JSON——李炎灰js笔记
  19. 将标签进行One-hot编码
  20. 40主题制作代码———更新手机颜色十六进制代码

热门文章

  1. mysql 建索引_mysql数据库正确建立索引及使用
  2. c 加密 java解密错误_google协议缓冲区-用C加密,用Java解密-InvalidProtocolBufferException...
  3. angularjsl路由_AngularJS路由和模板
  4. php mysql int string_php从mysql取出int数据,变成了string
  5. python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~
  6. 之全能忙内_闪闪发光刘耀文,全能忙内初长成,西南狼崽变狼王
  7. mysql性能优化:my.cnf配置文件
  8. windows cmd下的转义符
  9. java插入时间 mssql_JAVA操作数据库Datetime数据
  10. 电脑仙人掌机器人作文_【中考一等作文2篇】致敬奋斗的时光父爱如根般深沉...