设为首页 收藏本站
查看: 1082|回复: 0

[经验分享] tomcat + memcached session manager共享session

[复制链接]
YunVN网友  发表于 2018-11-29 10:22:23 |阅读模式
  网上有很多关于通过MSM(memcached session manager)实现memcached共享session的文章,但是很多都是东拼西凑,误导别人。正巧最近有一个地方用到,特此总结一下。
  MSM支持tomcat6,tomcat7,tomcat8,MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session)。我用到的是sticky session,所以以下都按照sticky session
  来介绍。集群结构是2个tomcat实例节点,2个memcached实例节点
       
           . \ / .
  machine1 .  X  . machine2
           . / \ .
     简单说明下:tomcat1为主要把它的session存储到memcached2上,而memcache2是运行在另一台主机上的(一般情况下,memcached是存tomcat1的session),只有当memcached2不可用时,tomcat1才会把session存在memcached1上,也就是说memcached1是为了tomcat1做故障切换用的节点。这要的话,当machine1挂了的时候,session是不会丢失的。

  

  接着我们考虑使用session的哪种序列化方式,默认的是使用java进行序列化,是由memcached-session-manager.jar这个jar包来提供的方法,而其它的序列化方式是由其它的jar包提供的。
  

  首先是要安装jdk和tomcat,这里不再赘述,当然tomcat可以选择支持native函数。在修改tomcat配置文件之前,先把一些jar包放在 $CATALINA_HOME/lib/( WEB-INF/lib)目录里,再修改$CATALINA_HOME/conf/ (META-INF/context.xml)配置文件。
  

  我们使用的是memcached,所以需要 spymemcached-2.11.1.jar
  补充:如果使用couchbase,需要添加以下jar包: couchbase-client-1.4.0.jar jettison-1.3.jar, commons-codec-1.5.jar, httpcore-4.3.jar,httpcore-nio-4.3.jar, netty-3.5.5.Final.jar
  

  需要注意的是,如果你使用java内置的序列化方式,把jar放在$CATALINA_HOME/lib/里即可。如果为了更好的性能,使用自定义的序列化方式,就要把其它jar包部署在具体java项目工程下的WEB-INF/lib里。以下是四种session序列化方式对应需要的jar包
  

  

  •   kryo-serializer: msm-kryo-serializer, kryo-serializers-0.11 (0.11 is needed, as 0.20+ is for kryo2), kryo, minlog, reflectasm, asm-3.2
  •   javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
  •   xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
  •   flexjson-serializer: msm-flexjson-serializer, flexjson
  

所以非粘性sessions 使用kryo序列化所需要增加的jar包如下:

  

  虽然我使用的是kryo序列化方式 + 非粘性session,但是还是把粘性session一起介绍一下。
sticky sessions粘性session + kryo序列化
  在machine1上有tomcat1和memcached1,tomcat的$CATALINA_HOME/conf/context.xml增加如下配置

  ...
  
  

  参数failoverNodes="n1" 是用来告诉 MSM 把session优先存储在 memcached2上,只有当memcached2挂了的时候才会把session存在memcache1也就是配置文件的n1里。
  假如整个machine1挂了,session还是可用,因为session是存在machine2的memcache2上,可以通过tomcat2对外提供服务。
  machine2上的tomcat2的配置文件只要改成failoverNodes="n2"即可。
  

  
non-sticky sessions 非粘性session + kryo序列化
  非粘性session是不需要配置failoverNodes,也就是故障切换节点的,因此session是由所有tomcat节点通过轮训(round-robin )来提供服务的,session是不和某单个tomcat节点绑定,所以tomcat所有节点的都是一样的,如下:

  ...
  
  配置完成后重新启动两个节点上的不同tomcat服务。

tail -f /usr/local/tomcat/logs/catalina.out
  两个节点tomcat的启动日志都正常。
  

  测试的session.jsp页面内容如下
SessionID:
SessionIP:
SessionPort:  浏览器访问测试页面

  页面获取的和我chrome浏览器截获的cookie里session id是一样的,这里补充下session id是保存在cookie里的。
  多次刷新页面session.jsp,发现session id不变化,再查看访问tomcat的访问日志,出现多条访问记录(这里补充说明,tomcat默认是关闭访问日志的,需要开启,然后自定义日志格式。)但是session保持不变。

  由于session默认是存在tomcat的jvm里的,我们验证一下memcached里是不是真的存了这个session记录,查询memcached存的内容然后导出到文件里
echo "stats cachedump 3 0" | nc 192.168.203.167 11211 > session.txt grep '6EDE9D610F85926D0A5AD01A991DC84C-n1 ' session.txt
  确认存在。
  至此tomcat的MSM,共享session的工作就做完了,good luck!




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-641063-1-1.html 上篇帖子: tomcat的session会话保持方案 下篇帖子: tomcat工作原理及目录文件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表