集群/分布环境下,session处理策略

前言

在搭建完集群环境后,不得不考虑的一个问题就是用户访问的seesion如何处理,如果不做任何处理的话,用户将出现频繁登录的现象.比如集中中存在A,B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器这时A服务器就会给用户创建一个session.当用户第二次发送请求时,ngnix将其负载均衡到b服务器,而这个时候b服务器并不存在session,所以会将用户导航到登录页面,这样的话肯定会降低用户的体验度,导致用户粘度下降.
我们应当低于产生session进行处理,通过一些处理策略,来保证用户的体验度.
五种session 的处理策略

粘性session

  1. 原理 :粘性session是指将用户锁定到某一服务器上,比如上面讲的demo,用户第一次请求时ngnix将用户请求转发到了A上,若ngnix配置了粘性session,那么用户每次请求都会转发到A服务器上,这样做,就相当于把用户A和服务器粘到了一起,这就是粘性的session机制.
  2. 优点:简单,不需要对session做任何处理.
  3. 缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上,他的session信息都将失效.
  4. 使用场景:发生故障后对客户产生影响较小;服务器发生故障时小概率事件
  5. 实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session。
upstream mycluster{
   #这里添加的是上面启动好的两台Tomcat服务器
   ip_hash;#粘性Session
    server 192.168.22.229:8080 weight=1;
    server 192.168.22.230:8080 weight=1;
}

服务器session复制

原理:任何一个服务器上的session发生改变(增删改)
该节点会把这个session的所有内容序列化,然后广播给所有的其他节点,不管其他服务器需不需要session’,以此来保证session同步.
优点:可容错,各个服务器的session能够实时响应.
缺点:会对网络复核造成一定压力,如果session量大的话,可能会造成网络堵塞,拖慢服务器性能.
实现方法:
设置tomcat,server.xml开启tomcat集群功能:
Address:填写本机IP即可,设置端口号,预防端口冲突。Address:填写本机IP即可,设置端口号,预防端口冲突。

在应用里增加信息:通知应用当前处于集群环境中,支持分布式。
在web.xml中添加选项:

session共享

使用分布式缓存方案,比如memcached,redis,但是要求memcached,redis必须是集群.
使用session共享,也分为阆中机制,
1.粘性session处理方式
原理:不同的tomcat指定访问不同的主mencached.多个mencacheed之间的信息是同步的.能主从备份和高可用.用户访问时,首先在tomcat中创建session,然后将session复制一份放到他对应的memcached上.memcached只起到备份的作用,读写都在tomcat上.当某一个tomcat挂掉之后,集群将用户的访问定位到备tomcat上,然后根据cookie中存储的sessionid找到session,找不到时再去相应的mencached上去寻找session,找到之后将其复制到tomcat上.

在这里插入图片描述
2、非粘性Session处理方式

原理:memcached做主从复制,写入Session在从memcached服务器上,读取Session从主memcached,Tomcat本身不存储Session。

在这里插入图片描述

优点:可容错,Session实时响应。

实现方式:用开源的msm插件解决Tomcat之间的Session共享:Memcached_Session_Manager(MSM)

a. 复制相关jar包到tomcat/lib 目录下

JAVA memcached客户端:spymemcached.jar

msm项目相关的jar包:

  1. 核心包,memcached-session-manager-{version}.jar
  2. Tomcat版本对应的jar包:memcached-session-manager-tc{tomcat-version}-{version}.jar

序列化工具包:可选kryo,javolution,xstream等,不设置时使用jdk默认序列化。
b. 配置Context.xml ,加入处理Session的Manager

粘性模式配置:
在这里插入图片描述
非粘性配置:
在这里插入图片描述

Session持久化到数据库

原理:拿一个数据库专门用来存储Session信息,保证Session的持久化。

优点:服务器出现问题,Session不会丢失。

缺点:如果网站的访问量很大,把Session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销,维护数据库。

Terracotta实现Session复制

原理:Terracotta的基本原理是对于集群间共享的数据,在当一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。这种方案可以看成是对第二种方案的优化。

在这里插入图片描述

优点:这样对网络的压力非常小,各个节点也不必浪费CPU时间和内存进行大量的序列化操作。把这种集群间数据共享的机制应用在Session同步上,既避免了对数据库的依赖,又能达到负载均衡和灾难恢复的效果。

总结
以上就是在集群或者分布式环境下,Session处理的5中策略。其中就应用广泛性而言,第三种方式,也就是基于第三方缓存框架共享Session,应用的最为广泛,无论是效率还是扩展性都还可以。而Terracotta作为一个JVM级的开源集群框架,不仅仅提供HTTP Session复制,它还能做分布式缓存,POJO群集,跨越群集的JVM来实现分布式应用程序协调等。

Ps:原文地址 http://blog.csdn.net/u010028869/article/details/50773174

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值