tomcat + memcached + nginx 实现session共享
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
这里重点强调如何实现linux服务器上 服务器session共享,软件安装不再赘述。
首先我们需要对 cookie 和session的工作机制非常了解,如果不了解其中的原理,就算配置成功,也毫无意义。换了工作换了环境,重新配置起来
仍然需要重头来过,事倍功半。
cookie是怎样工作的?
例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,
同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。
Set-Cookie:login=Michael Jordan;path=/;domain=msn.com; expires=Monday,01-Mar-99 00:00:01 GMT
上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个
Cookie的值是经过了URLEncode方法的URL编码操作的。
这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。
此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传到指定的服
务器上,而决不会跑到其他的如www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。
当然,如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。
说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而
且浏览器会这样一直发送,直到Cookie过期为止。
session又是如何工作的?
由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人,因此要用cookie或session来跟踪用户,根据授权和用户身份来
显示不同的页面。比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程,
你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。
cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会
返给服务器。注意:cookie可以被禁用,所以要想其他办法,这就是session。比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠
。该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)。
为什么要持久化SESSION?
在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重起/当机的话该session就会丢失,而客户端的操作应为session的丢失而造成数据丢失,而且
当前用户访问量巨大,每个用户的Session里存放大量的数据的话,那么就很占用服务器大量的内存,从而是服务器的性能受到影响。
番外篇
session 是非常重要的数据,非常宝贵。但是session同样也是缺憾满身,在大规模集群服务器中,最好使用其他替代方案。比如淘宝网。
对nginx的了解?
nginx 是一款非常优秀的服务器软件,其优秀程度这里不过多赘述。
进入正题
session 实现共享的方法分为多种
对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。要实现这一点,
大体上有两种方式,一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;另一种就是在集群中的所有节
点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。
一 使用tomcat自身集群特性完成session共享
这种方式是使用tomcat自身广播的特点来进行session同步拷贝,优点是简单,缺点是一旦tomcat集群数量过多,很容易引发广播风暴。
详细配置 请参照 博客 http://zyycaesar.iteye.com/blog/296606
粗略配置如下 tomcat/server.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="224.0.0.0" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.0.223" port="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
二 使用数据库持久化session
这里又分为物理数据库和内存数据库
物理数据库备份session,由于其性能的原因,这里不作介绍。
内存数据库 可以暂分为 redis 和 memcached
这里我们只介绍memcached
多个tomcat各种序列化策略配置如下:
一、java默认序列化tomcat配置
conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311" lockingMode="auto" sticky="false" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory" />
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
lib增加jar包:
spymemcached-2.10.3.jar memcached-session-manager-1.7.0.jar memcached-session-manager-tc7-1.7.0.jar
二、javolution序列化tomcat配置
conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311" lockingMode="auto" sticky="false" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" copyCollectionsForSerialization="true" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
lib增加jar包
msm-javolution-serializer-cglib-1.3.0.jar msm-javolution-serializer-jodatime-1.3.0.jar spymemcached-2.10.3.jar javolution-5.4.3.1.jar msm-javolution-serializer-1.7.0.jar memcached-session-manager-1.7.0.jar memcached-session-manager-tc7-1.7.0.jar
三、xstream序列化tomcat配置
conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311" lockingMode="auto" sticky="false" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory" />
lib增加jar包
xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar xstream-1.4.6.jar msm-xstream-serializer-1.7.0.jar spymemcached-2.10.3.jar memcached-session-manager-1.7.0.jar memcached-session-manager-tc7-1.7.0.jar
四、flexjson序列化tomcat配置
conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311" lockingMode="auto" sticky="false" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.json.JSONTranscoderFactory" />
lib增加jar包
flexjson-3.1.jar msm-flexjson-serializer-1.7.0.jar spymemcached-2.10.3.jar memcached-session-manager-1.7.0.jar memcached-session-manager-tc7-1.7.0.jar
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
五、kryo序列化tomcat配置
conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311" lockingMode="auto" sticky="false" requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" copyCollectionsForSerialization="true" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
lib增加jar包
kryo-1.04.jar minlog-1.2.jar asm-3.2.jar reflectasm-1.01.jar kryo-serializers-0.11.jar msm-kryo-serializer-1.7.0.jar spymemcached-2.10.3.jar memcached-session-manager-1.7.0.jar memcached-session-manager-tc7-1.7.0.jar
官网介绍说 使用kryo 序列化tomcat的效率最高 所以这里只介绍kryo序列化。具体效率对比,还需要进一步验证。
1 修改tomcat/context.xml文件 新增如下代码
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.0.216:11211" sticky="false" storageKeyPrefix="context" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
Manager 各参数说明:
className
必选项,可配置为
de.javakaffee.web.msm.MemcachedBackupSessionManager和de.javakaffee.web.msm.DummyMemcachedBackupSessionManager。
其中DummyMemcachedBackupSessionManager可用于测试环境,不需要真实存在memcached。
memcachedNodes
必选项,memcached的节点信息,格式如:
memcachedNodes="n1:app01:11211,n2:app02:11211"。
failoverNodes
可选项,不能使用在non-sticky sessions模式。故障转移配置节点,多个使用空格或逗号分开,配置某个节点为备份节点,当其他节点都不可用时才会存储到备
份节点,官方建议配置为和tomcat同服务器的节点。
理由如下:
假如有两台服务器m1,m2,其中m1部署tomcat和memcached节点n1,m2部署memcached节点n2。
如果配置tomcat的failoverNodes值为n2或者不配置,则当服务器m1挂掉后n1和tomcat中保存的session会丢失,而n2中未保存或者只保存了部分session,这就造成
部分用户状态丢失。
如果配置tomcat的failoverNodes值为n1,则当m1挂掉后因为n2中保存了所有的session,所以重启tomcat的时候用户状态不会丢失。
为什么n2中保存了所有的session? 因为failoverNodes配置的值是n1,只有当n2节点不可用时才会把session存储到n1,所以这个时候n1中是没有保存任何session的。
username
可选项,SASL的用户名,如果节点保护membase的bucket uri。
password
可选项,和username搭配使用。
memcachedProtocol
可选项,默认text,memcached使用的协议,可选值:text,binary。
sticky
可选项,默认true,制定是否使用粘性session模式。
说道sticky 需要简单介绍
Sticky 模式:
tomcat session 为 主session, memcached 为备 session。Request请求到来时, 从memcached加载备 session到 tomcat (仅当tomcat jvmroute发生变化时,
否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。
Non-Sticky模式:tomcat session 为 中转session, memcached1 为主 sessionmemcached 2 为备session。Request请求到来时,从memcached 2加载备 session
到 tomcat,(当 容器 中还是没有session 则从memcached1加载主 session 到 tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),
Request请求结束时,将tomcat session更新至主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的。
多台tomcat集群时 需要选择Non-Sticky模式,即sticky="false"
需要使用到得jar 列表如下
couchbase-client-1.2.2.jar kryo-1.03.jar kryo-serializers-0.10.jar memcached-2.5.jar memcached-session-manager-1.6.5.jar memcached-session-manager-tc7-1.6.5.jar minlog-1.2.jar msm-kryo-serializer-1.6.5.jar reflectasm-0.9.jar spymemcached-2.10.2.jar
如果你查看过源码,你就会发现,如果当你调试不成功,session不共享,一般都是 memcached-session-manager-1.6.5.jar
memcached-session-manager-tc7-1.6.5.jar msm-kryo-serializer-1.6.5.jar 这三个jar包出问题。所以版本也很重要。
服务器之间的时间戳一致也非常重要,因为时间不一致将直接导致session过期。
memcached 的启动所有者最好设置为nobody
本博文是经过实际电商项目验证,实际登录验证,验证过程中不断关停一些tomcat,所以本博文可作为真实参考。
验证项目为大红袜全球购。
lockingMode
可选值,默认none,只对non-sticky有效。
requestUriIgnorePattern
可选值,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。
sessionBackupAsync
可选值,默认true,是否异步的方式存储到memcached。
backupThreadCount
可选项,默认是cpu核心数,异步存储session的线程数。
sessionBackupTimeout
可选项,默认100毫秒,异步存储session的超时时间。
operationTimeout
可选项,默认1000毫秒,memcached的操作超时时间。
storageKeyPrefix
可选值,默认值webappVersion,存储到memcached的前缀,主要是为了区分多个webapp共享session的情况。可选值:静态字符串、host、context、webappVersion,
多个使用逗号分割。
sessionAttributeFilter
可选值,通过正则表达式确定那些session中的属性应该被存储到memcached。例子如:sessionAttributeFilter="^(userName|sessionHistory)$"。
transcoderFactoryClass
可选值,默认值de.javakaffee.web.msm.JavaSerializationTranscoderFactory,制定序列化和反序列化数据到memcached的工厂类。
三 使用 filter 方法存储
这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。
可以使用 memcached-session-filter
官方网址:http://code.google.com/p/memcached-session-filter/
官方介绍:解决集群环境下java web容器session共享,使用filter拦截器和memcached实现。在tomcat 6和websphere 8测试通过,现网并发2000,日PV量1100万。
暂不支持session event包括create destory 和 attribute change
东西很不错,体积很小,不过这个东东要和 spring 一起使用,而且要求存储到 memcached 的对象要实现 java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
将其简单扩展,就可以不再依赖 spring ,并且利用 javolution 实现序列化,缓存的对象不再有限制。
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
相关推荐
本文将详细介绍如何在Nginx、Tomcat7和Memcached的环境下实现会话保持,确保用户在多台服务器之间切换时仍能保持其会话状态。 首先,我们要理解会话保持的重要性。在分布式系统中,用户可能与集群中的任何一台...
Nginx+Tomcat7+Memcached集群Session共享 ...主要是利用memcached-session-manager(下面简称msm)开源tomcat插件改变tomcat原始的session存储机制,将session的存储放到分布式缓存memcache中,从而实现对session的共享
描述中提到的“nginx+tomcat8+memcached session共享所需jar包,直接放到tomcat/lib下即可”,暗示了实现这一功能需要一些特定的Java库(JAR包)。这些JAR包将集成到Tomcat的运行环境中,使Tomcat能够与Memcached...
本主题聚焦于如何使用Nginx、Tomcat 8.0和Memcached 1.5来实现session共享,确保用户在访问不同服务器时能够保持登录状态。以下是对这些组件以及提供的jar包的详细解释。 首先,Nginx是一款高性能的反向代理服务器...
兼容Tomcat7 与tomcat8 +memcached做session共享 , 解决了tomcat7与Tomcat8的 java.lang.NoSuchFieldError: attributes 错误。
"Windows+Nginx+Tomcat7+Memcached.zip" 提供了一种解决方案,它整合了四个关键组件来实现这一目标:Windows操作系统、Nginx反向代理服务器、Tomcat 7应用服务器以及Memcached内存缓存系统。以下将详细介绍这些组件...
在构建高性能、高可用性的Web应用系统时,通常会采用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器,而Memcached作为分布式缓存来处理session共享问题。本文将详细讲解如何利用Nginx、Tomcat和Memcached...
在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...
"nginx+tomcat7+memcached所需jar"的组合提供了一种解决方案,利用Memcached作为分布式缓存来实现跨服务器的session共享,提高系统的可扩展性和可用性。这个组合的关键在于`memcached session manager`,它使得...
在构建高性能的Web应用系统时,常常会采用“前端代理...在实际部署时,还需要配置Nginx的反向代理规则,Tomcat的session管理策略以及Memcached的服务器连接参数,确保三者协同工作,构建出高效稳定的Web服务环境。
2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可选一,否则启动报错。 3)msm源码中的lib包版本太低:spymemcached需要使用...
通过以上步骤,我们能够有效地在Nginx、Tomcat和Memcached之间实现Session共享,从而在分布式环境中提供一致的用户体验。这种解决方案不仅提高了系统的可扩展性,还降低了单点故障的风险。在实际操作中,还可以根据...
couchbase-client-1.2.2.jar ...memcached-session-manager-1.6.5.jar memcached-session-manager-tc6-1.6.5.jar minlog-1.2.jar msm-kryo-serializer-1.6.5.jar reflectasm-0.9.jar spymemcached-2.10.2.jar
本主题将详细探讨如何在Windows7环境下,利用Nginx作为负载均衡器,Memcached作为session存储,以及Tomcat作为应用服务器,实现session共享。 **1. Nginx介绍与配置** Nginx是一款高性能的HTTP和反向代理服务器,它...
使用Nginx做的负载均衡,memcache做高速cache,tomcat7.0.22做web容器环境下的session共享及缓存。 能够做到重启tomcatsession不失效或多个tomcat应用下session共享。 该RAR包包含了配置所需要的全部jar文件。
【Nginx、memcached和Tomcat集群配置实现session共享与负载均衡】 在Windows环境下,构建一个基于Nginx的高可用性Web集群,通常包括Nginx作为反向代理和负载均衡器,memcached用于session共享,以及多个Tomcat实例...
总结来说,Tomcat+memcached+Nginx实现session共享是通过MSM中间件,配合Nginx的负载均衡,将session数据存储在memcached中,实现跨服务器的用户状态一致性。配置过程涉及到Tomcat、memcached和Nginx的安装、配置...
memcached-session-manager-1.6.3.jar memcached-session-manager-tc6-1.6.3.jar minlog-1.2.jar msm-javolution-serializer-1.6.3.jar msm-kryo-serializer-1.6.3.jar msm-xstream-serializer-1.6.3.jar reflectasm...
nginx+tomcat7+session共享 kryo序列化所需要包 1.将上面所提到的包全部拷贝到tomcat的lib下(三台tomcat都需要) 2.修改每台tomcat的conf目录下得context.xml文件或者server.xml文件,在其中加入如下任意一段代码...