两个基本概念的生命周期

session:

当新客户端发现一个HTTP请求时服务端会创建一个session.并分配一个sessionID作为服务端来客户端的识别,session对象会保存在服务端.此时session对象处天NEW STATE状态,如果调用 session.isNew()则返回true.

当服务器处理完后,会将sessionID同reponse 一起传回客户端,并将其存到cookie中;

当客户端再发送请求的时候.会将sessionID连同request一起发送给服务端;

服务端再根据传过来的sessionID将这次request与保存在服务端的session对象联系起来.此时的session对象已不是NEWSTATE状态.

这样循环多次.直到超时或销毁.

注:当禁用cookie时也是不能使用session的;

cookie:

cookie是在客户端保存的方案.而session是在服务端保存的方案.

如果cookie不设定时间的话就表视它的生命周期为浏览器会话的期间,只要关闭IE,cookie就消失了

这种cookie被称为会话cookie.其一般不保存在硬盘上.而是保存在内存中.

如果设置了过期时间.那么浏览器会把cookie保存到硬盘中,再次打IE时会依然有效.直到它的有效期

超时;

注:存储在硬盘中的cookie可以在不同IE间共享;

 

 

1.背景

随着互联网的日益壮大,网站的pv和uv成线性或者指数倍的增加.单服务器单数据库早已经不能满足实际需求。目前大多数大型网站的服务器都采用了分布式服务集群的部署方式,所谓集群,就是让一组计算机服务器协同工作,解决大并发,大数据量瓶颈问题。但是在服务集群中,session共享往往是一个比较头疼的问题。因为session是在服务器端保存的,如果用户跳转到其他服务器的话,session就会丢失,一般情况下,session不可跨服务器而存在。于是就有了分布式系统的session共享问题。

2.Session共享实现方案

Session共享有多种解决方法,常用的有四种:客户端Cookie保存、服务器间Session同步、使用集群管理Session、把Session持久化到数据库。下面分别就这四种方案进行介绍和比较。

2.1客户端Cookie保存

介绍说明

以cookie加密的方式保存在客户端.优点是减轻服务器端的压力,每次session信息被写在客服端,然后经浏览器再次提交到服务器。即使两次请求在集群中的两台服务器上完成,也可以到达session共享。

这种解决方法的优点是session信息不用存放在服务器端,大大减轻了服务器的压力。另一个优点是一个session中的两次或多次请求可以在一个集群中的多个服务器上完成,可以避免单点故障。目前,淘宝是采用的这种解决方案。

缺点有几个,一是传递cookie时,http信息头的长度限制使我们只能够在cookie中存入一部分用户信息;二是需要额外地做session信息加密的工作;第三,如果采用这种方式,每次访问网站二级域名时都会在http信息头中带有这些以cookie形式存储的session信息,会占用一定的带宽;最后,由于这种方式是在客户端进行信息存储,用户完全可以禁用cookie或删除cookie,不是很可靠。

 
2.2服务器间Session同步
介绍说明
使用主-从服务器的架构,当用户在主服务器上登录后,通过脚本或者守护进程的方式,将session信息传递到各个从服务器中,这样,用户访问其它的从服务器时,就可以读到session信息。
缺点:比如速度慢、不稳定等,另外,如果session信息传递是主->从单向的,会有一些风险,比如主服务器down了,其它服务器无法获得session信息
 
2.3 使用集群统一管理Session
介绍说明
提供一个群集保存session共享信息.其他应用统统把自己的session信息存放到session集群服务器组。当应用系统需要session信息的时候直接到session群集服务器上读取。目前大多都是使用Memcache来对Session进行存储。
以Memcache来实现Session共享的方式目前比较流行的有两种实现方案,下面主要对这两种方案进行介绍。
2.3.1 使用Filter方式
此方式使用过滤器的方式重新对httpRequest 对象进行了包装,并加入memcached客户端,此方式的优点是:使用简单,把过滤器配置进去即可,另外比较灵活,因为它是在客户端实现的,配置比较灵活,而且服务器无关,你可以在任何支持servlet的容器上部署。
2.3.2 memcached-session-manager(MSM)
memcached-session-manager,俗称MSM,是一个用于解决分布式tomcat环境下session共享的问题的开源解决方案。它的实现原理为以tomcat插件的方式部署在服务器,修改了servlet容器代码中的session相关代码,使其连接memcached,在memcached中创建和更新session。MSM拥有如下特性:
  • 支持Tomcat6、Tomcat7
  • 支持黏性、非黏性Session
  • 无单一故障点
  • 可处理tomcat故障转移
  • 可处理memcached故障转移
  • 插件式session序列化
  • 允许异步保存session,以提升响应速度
  • 只有当session有修改时,才会将session写回memcached
  • JMX管理&监控
MSM(memcached-session-manager) 支持tomcat6 和tomcat7 ,利用 Value(Tomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的, 支持 sticky  和 non-sticky 模式。
优点:开发者不用考虑session共享的问题了,可以专注于程序开发,像正常使用session那样使用就完事了。不用显示编写代码,只需要对服务器进行配置即可使用。
缺点:如果你想改变session策略的话,必须重新部署每个服务器的servlet容器。
 
2.4 把Session持久化到数据库
介绍说明
这种共享session的方式即将session信息存入数据库中,其它应用可以从数据库中查出session信息。目前采用这种方案时所使用的数据库一般为mysql。
利用数据库共享session的方案有一定的实用性,但也有如下缺点:首先session的并发读写在数据库中完成,对mysql的性能要求比较高;其次,我们需要额外地实现session淘汰逻辑代码,即定时从数据库表中更新和删除session信息,增加了工作量
 
附:这份调研报告主要是从网上的资料综合整理而成,如有涉及到侵权的地方,请作者及时联系我,我会第一时间删除。

集群间Session共享问题解决方案的更多相关文章

  1. 集群中Session共享解决方案分析

    一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...

  2. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

  3. Java集群之session共享解决方案

    随着互联网的日益壮大,网站的pv和uv成线性或者指数倍的增加.单服务器单数据库早已经不能满足实际需求.比如像盛大,淘宝这样的大型网络公司,更是如此.     集群,也就是让一组计算机服务器协同工作,达 ...

  4. Tomcat集群的session共享

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  5. CAS 集群部署session共享配置

    背景 前段时间,项目计划搞独立的登录鉴权中心,由于单独开发一套稳定的登录.鉴权代码,工作量大,最终的方案是对开源鉴权中心CAS(Central Authentication Service)作适配修改 ...

  6. 关于 tomcat 集群中 session 共享的三种方法

    前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...

  7. tomcat集群及session共享

    一般来说,java web app主要用作两个领域: 1.api.api一般是无状态的,所以无需考虑session共享的问题 2.传统web应用和网站,如crm,oa,erp,b2c,bbs等.尤其b ...

  8. 基于tomcat集群做session共享

    前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...

  9. Tomcat 集群 + Redis Session 共享出现 Session 瞬间失效问题

    写在前面的话 写这篇博客出于公司最近要迁移到新的云上面且对之前的资源,架构做一个升级. 本来是一个不大的项目,旧环境旧一个 TOMCAT 跑起来,不过出于高可用考虑,新环境决定使用 TOMCAT 集群 ...

随机推荐

  1. C# 方法返回值的个数

    方法返回值类型总的来说分为值类型,引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) { return a+b; } 有些方法隐式的返回返回值,我们可 ...

  2. 自动执行任务管理---TaskManage

    这篇主要配合数据使用 先说数据库 名字都很标准---------------------------------- ------------------------------------------ ...

  3. OMXplayer播放视频的参数说明

    1.OMXplayer支持硬解码,因此是一个非常不错的选择.2.支持格式目前知道的有:MKV.AVI.FLV.MP43.如果想用全屏播放,参数是:-r4.如果想用HDMI输出声音,参数是:-o hdm ...

  4. vmstat和iostat

    一.vmstat1.命令示例#vmstat 5每5秒输出一次 2.输出详解procs -----------memory---------- ---swap-- -----io---- --syste ...

  5. Java_Map_Map详解

    本博客为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/8867065 1.Map概述 Map<K,V>  Map集 ...

  6. MySQL:动态开启慢查询日志(Slow Query Log)

    前言 在开发中,高效能的程序 也包括 高效能的查询,所以优化SQL也是程序员必要技能之一.要优化就必须要有慢日志记录才可以知道哪些查询慢,然后反向去修改 慢日志设置方式 写入文件 写入数据库 实践操作 ...

  7. SSH登录远程主机执行脚本找不到环境变量

    这是因为在Linux上,bash会有四种模式,根据不同的case,Linux会加载不同模式的bash.一般如果你自己直接登录主机,能看到环境变量,但是使用ssh 远程登录执行脚本就找不到环境变量,那么 ...

  8. 利用jQuery对插件进行扩展时,方法$.extend()、$.fn.extend()区别与联系

      利用JQ开发插件的方法: 1.jQuery.extend(); 2.jQuery.fn.extend(); 3.通过$.widget()应用jQuery UI的部件工厂方式创建. 由于第三种方式通 ...

  9. 本地代码如何通过TortoiserGit提交到GitHub

    昨天博文给大家讲解了一下如何本地安装TortoiseGit http://www.cnblogs.com/xinlj/p/5978730.html,今天为大家讲一下如何通过TortoiseGit将本地 ...

  10. BundleConfig.cs

    namespace Knockout.App_Start { public class BundleConfig { public static void RegisterBundles(Bundle ...