前言

在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session。当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的。

我们应当对产生的Session进行处理,通过粘性Session,Session复制或Session共享等方式保证用户的体验度。

以下我将说明5种Session处理策略,并分析其优劣性。

第一种:粘性session

原理:粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制。

优点:简单,不需要对session做任何处理。

缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的session信息都将失效。

适用场景:发生故障对客户产生的影响较小;服务器发生故障是低概率事件。

实现方式:以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即可,设置端口号,预防端口冲突。

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

第三种:session共享机制

使用分布式缓存方案比如memcached、redis,但是要求Memcached或Redis必须是集群。

使用Session共享也分两种机制,两种情况如下:

① 粘性session处理方式

原理:不同的 tomcat指定访问不同的主memcached。多个Memcached之间信息是同步的,能主从备份和高可用。用户访问时首先在tomcat中创建session,然后将session复制一份放到它对应的memcahed上。memcache只起备份作用,读写都在tomcat上。当某一个tomcat挂掉后,集群将用户的访问定位到备tomcat上,然后根据cookie中存储的SessionId找session,找不到时,再去相应的memcached上去session,找到之后将其复制到备tomcat上。

② 非粘性session处理方式

原理:memcached做主从复制,写入session都往从memcached服务上写,读取都从主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来实现分布式应用程序协调等,也值得学习一下。

博客转自:https://blog.csdn.net/u010028869/article/details/50773174

集群/分布式环境下5种session处理策略相关推荐

  1. mysql集群session_集群/分布式环境下5种session处理策略

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...

  2. 【Linux运维-集群技术进阶】集群/分布式环境下5种session处理策略

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...

  3. 基于k8s多集群隔离环境下的devops实现

    简介:本方案使用两个独立的k8s集群:用户已有的k8s模拟测试,ack集群模拟生产环境,保证环境的高度隔离,互不影响.通过gitlab+Jenkins的黄金组合,实现容器应用的自动化构建和持续部署,提 ...

  4. Spring-Redis实现分布式环境下主子域名Session共享

    背景: 之前一直采用通过注解的方式配置Spring环境下的子域名共享,其基本思路是通过将session放入redis中,然后将使用HTTPSESSION更改为使用SpringSession的方式,使得 ...

  5. Apache+Tomcat集群负载均衡的两种session处理方式

    session共享有两种方式: 1.session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态: 2.请求精确集中定位,即当前用户的请求都集中定位到一台服务器中,这样单台服务 ...

  6. nginx集群_windows环境下搭建简单Nginx+Tomcat集群

    通俗点将,负载均衡就是因为访问流量太大,导致项目访问不流畅.甚至宕掉,所以通过一种分流的方式来缓解这种情况. 一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 ...

  7. 技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战)

    原文链接:技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战) 最近有小伙伴催更,让debug多写点技术干货,以便多学习.巩固一些技能:没办法 ...

  8. C#session共享+redis_Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享...

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:夜月归途 转载自: https://www.cnblo ...

  9. 面试官:分布式环境下,如何实现session共享

    点击关注公众号,实用技术文章及时了解 先了解一下为什么会出现这种session共享的解决方案? 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集 ...

最新文章

  1. Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!
  2. OpenGL ES3 非常好的系列文章
  3. java面试题标签_java面试笔试题 (WEB)
  4. android-数据库SQLite相关
  5. vs编译项目报错:The OutputPath property is not set for this project
  6. python爬虫表格中清除空格_爬虫清洗:python strip()函数 去空格\n\r\t函数的用法
  7. 【2016年第2期】大数据背景下的治理现代化:何以可能与何以可为(上)
  8. Hashtable Dictionary的使用
  9. 一文搞懂Python知识难点------装饰器
  10. 一个REST风格的URI设计方案[Blog Web Services]
  11. 印度首颗 CPU 横空出世:软件开发已开动
  12. SVN报错 could not connect to server
  13. 装ubuntu_系统安装_win10下安装Ubuntu后,启动时无win10选项的解决办法。
  14. VMware Workstation macOS Unlocker 下载慢的解决办法
  15. UDP协议和TCP协议
  16. ffmpeg下载视频
  17. CY2荧光染料,Cy2@NHS酯基本染料,Cy2DIGE NHS ester的物化性质及光谱特性
  18. C/C++刁钻问题各个击破之细说sizeof .
  19. jQuery实现模拟微博发布框
  20. 用python画猪_用python画小猪佩奇(非原创)

热门文章

  1. Camera-摄像头工作原理(转载)
  2. route 添加路由 和 IP route 添加路由
  3. 通过深度残差网络ResNet进行图像分类(pytorch网络多网络集成配置)
  4. 微信小程序-个人总结
  5. 钉钉自定义Outgoing机器人开发
  6. antlr4小试牛刀-sql转换成es dsl
  7. typedef 详解
  8. appscan策略_AppScan策略简介
  9. JS本地存储localStorage封装
  10. JS本地存储的方式?区别?应用?