`
come_for_dream
  • 浏览: 120238 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

session在集群间的共享问题

阅读更多

会话跟踪

我们知道在单机条件下session机制的通过cookie或者Url重写完成的,具体的做法是在用户第一请求到getSession方法时创建session并将创建cookie和jsessionid(String字段用来标识session),并把行用页面内所有的URL改写(在尾部家伙snag了jsessionid),然后发送到客户端。客户端再次请求(包含了是否允许cookie的信息),这次请求是已经被服务器做了URL重写了,所以会话被跟踪了。在服务器接受本次请求的时候,会判断 cookie是否被客户端浏览器接受,如果cookie不被接受,那么继续用URL重写来达到会话跟踪,如果cookie被接受那么首选用cookie实现会话跟踪。

Session数据结构

在servlet/jsp中,容器是用何种数据结构来存储session相关的变量的呢?

       我们猜测一下,首先它必须被同步操作,因为在多线程环境下session是线程间共享的,而web服务器一般情况下都是多线程的(为了提高性能还会用到池技术);其次,这个数据结构必须容易操作,最好是传统的键值对的存取方式。

 

    那么我们先具体到单个session对象,它除了存储自身的相关信息,比如id之外,tomcat的session还提供给程序员一个用以存储其他信息的接口(在类org.apache.catalina.session. StandardSession里):

public void setAttribute(String name, Object value, boolean notify)
protected  java.util.Map attributes 
          The collection of user data attributes associated with this Session.

 然后其attribute属性是一个Map结构,所以很显然线程安全的Map结构我们首选ConcurrentHashMap作为其具体的对象,这是java的concurrent包里的一个类。它刚好满足了我们所猜测的两点需求:同步与易操作性。 

 

 那么tomcat又是用什么数据结构来存储所有的session对象呢?果然还是ConcurrentHashMap(在管理session的org.apache.catalina.session. ManagerBase类里):

protected Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();

 具体原因就不必多说了。至于其他web服务器的具体实现也应该考虑到这两点。

 

 集群环境下的Session机制

现在由于互联网的日益发展,很多网站的访问量也日益的增大,单机服务器和数据库已经不能承受我们网站的访问压力,所以现在的系统都是做成了分布式集群以解决大并发大数据量的要求,比如淘宝就是一个非常经典的例子。酷那么问题来了,一个客户端发出的多条请求被多态服务器处理,对于客户端的传过来的cookie或url重写的请求,我们如何在分布式多态机器上面实现session共享呢?

一般情况下session不可以跨服务器存在,下面给出几种session共享的方式:

            第一种,客户端解决方法.把session加密后存在cookie中,每次session信息被写在客服端,然后经浏览器再次提交到服务器.即使两次请求在集群中的两台服务器上完成,也可以到达session共享.这种解决方法的优点是session信息不用存放在服务器端,大大减轻了服务器的压力.另一个优点是一个session中的两次或多次请求可以在一个群集中的多个服务器上完成,可以避免单端故障.目前,淘宝是采用的这种解决方案. 基于Cookie的Session共享 这个方案我们可能比较陌生,但它在大型网站中还是比较普遍被使用。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。 这个方案的优点无需额外的服务器资源;缺点是由于受http协议头长度的限制,仅能够存储小部分的用户信息,同时Cookie化的 Session内容需要进行安全加解密(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证),另外它也会占用一定的带宽资源,因为浏览器会在请求当前域名下任何资源时将本地Cookie附加在http头中传递到服务器。

            第二种,提供一个群集保存session共享信息.其他应用统统把自己的session信息存放到session群集服务器组.当应用系统需要session信息的时候直接到session群集服务器上读取.这种方式具有第一种方式的第二个优点,现在可能淘宝也在用这种方式,他们使用具体的session共享框架目前还不知道,

有一个哥们在研究bboss的会话共享框架:

bboss会话共享框架,快速实现集群节点间会话共享和跨域跨应用会话共享,实现与具体容器无关,能够统计在线会话数,还能在统一监控中心管理应用会话(删除会话,查询会话数据等),参考资料:

bboss会话共享demo使用指南 
bboss session共享架构及特点
bboss session共享使用方法介绍
bboss会话共享培训文档分享

 

            第三种,配置负载均衡服务器,让用户的一个session在一个服务器完成.定时的备份session信息到salve上面.一台服务器down掉后,通过均衡服务器透明把用户的请求转发到群集中的其他服务器上,此时需要从salve上读取备份的session信息. 但是这种方式个人感觉比较扯,这种方式的意思就是让服务器保存特定用户的session然后让用户每次都访问这台服务器,也就不存在session共享的问题了,同时这台服务器还有salve作为备份,一旦这台挂掉了,那么就要器Salve上。

  给大家推荐一篇不错的总结:淘宝技术架构

 

 

 

 

 

 

 

 

 

0
0
分享到:
评论
4 楼 仗剑执法1 2015-03-26  
各有利弊,第二种方案应该是最稳妥的
3 楼 raulvii 2015-03-26  
第三种很像WebSphere使用的集群(Cluster)机制
2 楼 come_for_dream 2015-03-26  
wwwcomy 写道
写的不错啊怎么这么多踩的, 刚知道这第一种方式,回去看看淘宝是不是真这么做的。

第三种就是session粘连嘛。 感觉通常来说第二种用的最多。


但是第一种方式用户把浏览器拒绝cookie怎么办???
1 楼 wwwcomy 2015-03-26  
写的不错啊怎么这么多踩的, 刚知道这第一种方式,回去看看淘宝是不是真这么做的。

第三种就是session粘连嘛。 感觉通常来说第二种用的最多。

相关推荐

    was集群session共享设置

    在was集群中,通常需要设置session共享,按照文档步骤可以完成session共享设置,解决你应用中的问题

    tomcat8.5.29 redisclouder集群 session共享集群相关配置文件

    tomcat8.5.29 redisclouder集群 session共享集群相关配置文件 亲测可用tomcat8.5.29 redisclouder集群 session共享集群相关配置文件 亲测可用 tomcat8.5.29 redisclouder集群 session共享集群相关配置文件 亲测可用 ...

    tomcat集群session共享

    session共享的主要目的是确保用户在集群中的任意一台服务器上操作都能被其他服务器识别,以保持用户的会话连续性。在没有正确处理session共享的情况下,用户可能需要在每次服务器切换时重新登录,这对用户体验极其...

    tomcat集群session共享解决方案

    在学习这些解决方案时,可以参考“Tomcat集群资料”中的文档,它们通常包含配置示例、最佳实践和常见问题解答,帮助你更好地理解和实施session共享策略。同时,理解负载均衡原理、分布式系统设计以及安全性问题也是...

    tomcat8集群实现session共享,内含session共享包

    在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...

    tomcat7集群session共享memcache依赖包1.8.3

    然而,由于每个Tomcat实例都有自己的内存空间,所以默认情况下,每个服务器会独立维护用户的Session信息,导致Session无法在集群间共享。 接下来,我们来看Memcached。Memcached是一个高性能、分布式的内存对象缓存...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...

    集群redis实现session共享jar包之tomcat8

    然而,随着集群的建立,一个问题也随之出现:如何在不同的服务器之间共享用户会话(session)。`session共享`成为了多台Tomcat服务器协同工作时必须解决的关键问题。本篇文章将深入探讨在Tomcat 8中通过`集群redis`...

    【全套】tomcat集群Session共享

    5. **测试与优化**:部署应用后,进行测试以确保Session在集群间正确共享。可能需要根据实际负载调整Redis的配置,例如增加连接池大小、调整超时时间等。 总的来说,“【全套】tomcat集群Session共享”这套资源包含...

    tomcat集群使用redis解决session共享问题

    tomcat集群使用redis解决session共享问题,压缩包包含redisclient-win32.x86.2.0客户端、Redis-x64-3.2.100服务、tomcat-redis-session以及部署安装文档

    redis+tomcat集群配置session共享

    在分布式系统中,Session共享是一个重要的议题,尤其是在使用Redis与Tomcat构建的集群环境中。当用户在集群中的任一节点登录后,其Session信息需要在其他节点也能访问,以实现会话持久化,保证用户体验的一致性。本...

    msm集群session共享

    `msm集群session共享`是指在多个Tomcat服务器之间实现用户session数据的共享,以保证用户在集群中的任意一台服务器上都能保持登录状态和其他会话信息的连续性。这种技术常用于提升网站的可用性和负载均衡能力。 `...

    tomcat7+redis集群 session共享jar

    4. **测试与优化**:部署应用程序后,通过模拟多服务器环境进行测试,确认Session能在集群间正确地共享和同步。同时,根据实际需求调整Session的超时时间、Redis的缓存策略等参数。 通过这种方式,"tomcat7+redis...

    redis 集群共享Session

    本文将深入探讨“redis集群共享Session”的实现原理与步骤。 1. **Redis简介** Redis是一种高性能的键值数据库,支持多种数据结构如字符串、哈希、列表、集合和有序集合。由于其内存存储和高效的性能,Redis常被...

    tomcat8集群session共享(redis处理)

    在构建高可用的Web服务时,Tomcat集群是常见的选择,但随之而来的一个问题就是如何在集群中的各个节点间共享Session。"Tomcat8集群session共享(redis处理)"的主题正是针对这一问题,通过集成Redis作为分布式缓存来...

    tomcat7 集群通过redis共享session 所需jar包

    在构建高可用的Tomcat7集群中,一个关键问题是如何在不同的服务器实例之间共享用户Session信息,以确保用户状态在集群中的无缝切换。在这种场景下,我们可以利用Redis作为中间件来实现Session的共享。以下是对这个...

    CASClient集群环境的Session问题及解决方案.docx

    但是在集群环境中应用 CASClient 时,可能会出现一些问题,例如 Session 信息不一致、统一注销的难题等。 Session 信息的问题 在集群环境中,每个 CASClient 应用都有其自己的 Session 信息,这些信息是存储在...

    Tomcat7集群实现共享session,已配置好。

    总之,通过合理配置Tomcat集群和使用Redis作为session存储,我们可以实现跨服务器的session共享,确保用户在多台服务器间的会话一致性。这个压缩包提供了一个预配置的解决方案,对于快速搭建和测试session共享环境...

Global site tag (gtag.js) - Google Analytics