分布式session



前端用户请求经过随机分发之后,可能会命中后端任意的Web Server,并且 Web Server

也可能会因为各种不确定的原因宕机。在这种情况下,session 是很难在集群间同
步的,而通过将session 以sessionid 作为key,保存到后端的缓存集群中,使得不管请求如何分
配,即便是Web Server 宕机,也不会影响其他Web Server 通过sessionid 从Cache Server 中获得
session,这样既实现了集群间的session 同步,又提高了Web Server 的容错性。



这里以 Tomcat 作为Web Server 来举例,通过一个简单的工具memcached-session- manager9,
实现基于memcache 的分布式session。
memcached-session-manager 是一个开源的高可用的Tomcat session 共享解决方案,它支持
Sticky 模式和Non-Sticky 模式。Sticky 模式表示每次请求都会被映射到同一台后端Web Server,
直到该Web Server 宕机,这样session 可先存放在服务器本地,等到请求处理完成再同步到后端
memcache 服务器;而当Web Server 宕机时,请求被映射到其他Web Server,这时候,其他Web
Server 可以从后端memcache 中恢复session。对于Non-Sticky 模式来说,请求每次映射的后端
Web Server 是不确定的,当请求到来时,从memcache 中加载session;当请求处理完成时,将session 再写回到memcache。
以 Non-Sticky 模式为例,它需要给Tomcat 的$CATALINA_HOME/conf/context.xml 文件配
置SessionManager,具体配置如下:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.100:11211,n2:192.168.0.101:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
其中:memcachedNodes 指定了memcache 的节点;sticky 表示是否采用Sticky 模式;
sessionBackupAsync 表示是否采用异步方式备份session;lockingMode 表示session 的锁定模式;
auto 表示对于只读请求,session 将不会被锁定,如果包含写入请求,则session 会被锁定;
requestUriIgnorePattern 表示忽略的url;transcoderFactoryClass 用来指定序列化的方式,这里采用
的是Kryo 序列化,也是memcached-session-manager 比较推荐的一种序列化方式。
memcached-session-manager 依赖于memcached-session-manager-${version}.jar,如果使用的是
tomcat6,则还需要下载memcached-session-manager-tc6-${version}.jar,并且它还依赖memcached-
${version}.jar 进行memcache 的访问。在启动Tomcat 之前,需要将这些jar 放在$CATALINA_
HOME/lib/目录下。如果使用第三方序列化方式,如Kryo,还需要在Web 工程中引入相关的第三方
库,Kryo 序列化所依赖的库,包括kryo-${version}-all.jar 、kryo-serializers-${version}.jar 和
msm-kryo-serializer. ${version}.jar。

时间: 2024-11-08 20:27:33

分布式session的相关文章

基于ZooKeeper的分布式Session实现(转)

1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动 物所观赏.为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管理员按照动物的各种习性加以分类和管理,这样我们才 能更加放心安全的观赏动物.回到我们企业级应用系统中,随着信息化水平的不断提高,我们的企业级系统变得越来越庞大臃肿,性能急剧下降,客户抱怨频频.拆 分系

关于分布式Session 的几种实现方式

分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统 3.基于memcached 的session,如何保证 memcached 本身的高可用性? 4. 基于resin/tomcat web容器本身的session复制机制 5. 基于TT/Redis 或 jbosscache 进行 session 共享. 6. 基于cookie 进行session共享 介绍下常用的分布式Session 实现 1. Session Replication 方式管理 (

net之session漫谈及分布式session解决方案

最近一直在纠结net下分布式会话的实现,现将近日来的个人感想记录如下,如果有什么更好的解决方案请指教. 1.什么是session: Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话.Session 对象

基于ZooKeeper的分布式Session实现

基于ZooKeeper的分布式Session实现 1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动 物所观赏.为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管理员按照动物的各种习性加以分类和管理,这样我们才 能更加放心安全的观赏动物.回到我们企业级应用系统中,随着信息化水平的不断提高,我们的企业级系统变得越

Spring Session解决分布式Session问题的实现原理

使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例,下边就学习一下Spring Session的实现原理. 注:以下步骤是基于XML的方式实现 Spring Session的代码讲解! 先从web.xml文件说起 我们知道Tomcat再启动的时候首先会去加载web.xml 文件,Tomcat启动的时候web.xml被加载的顺序:context-pa

可扩容分布式session方案

分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器io限制,不能满足高并发. 2. 基于关系数据库的session共享 这种方案普遍使用.使用关系数据库存储session数据,对于mysql数据库,建议使用heap引擎. 这种方案性能取决于数据库的性能,在高并发下容易造成表锁(虽然可以采用行锁的存储引擎,性能会下降),并且需要自己实现session过

HttpServletRequestWrapper模拟实现分布式Session

HttpSession的内容都放在一个单独的Map中,模拟远程分布式Session. 1.使用HttpServletRequestWrapper创建自定义Request2.使用动态代理包装自定义Request返回的HttpSession对象3.创建过滤器,使用自定义Request替换原有的Request对象.4.在Servlet中得到的HttpSession对象,写入和读取内容都假设通过远程Session服务器. 创建自定义的Request,返回动态代理的HttpSession import j

[Node.js] Node + Redis 实现分布式Session方案

Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向哪个连接,需要客户端传递向服务端发送一个连接标识,比如存在Cookies 中的session_id值(也可以通过URL的QueryString传递),服务端根据这个id 进行存取状态信息. 在服务端存储 Session,可以有很多种方案: 内存存储 数据库存储 分布式缓存存储 分布式Session

redis 实现分布式session配置

Redis分布式session配置 如上图,多实例下可以使用redis实现分布式session管理,客户端请求,经过负载均衡分发至tomcat实例,再经过session管理,实现session在redis中存取,这里暂时只有一台redis机器. 具体代码如下: 1.redis配置 可以使用spring-cache.xml作为redis配置文件名,首先配置redis缓存池: <bean id="jedisPoolConfig" class="redis.clients.j

如何使用Spring Session实现分布式Session管理

Spring Session作为Spring社区官方推荐的一个比较简单快速的Java Web分布式session解决方案,帮我们搞定了长期以来比较蛋疼的session分布式的问题. Spring Session解决的基本思路很简单,即将用户的session信息全部存放到一个redis数据库中,所有的session都从这个数据库拿.由于redis是一个内存数据库,数据信息读写是非常快速的.如此一来,多个Tomcat,共用一个redis数据库,即实现了session的共享问题. 鉴于目前很少看到Sp