在分布式Web应用环境中,Tomcat服务器的会话(Session)管理对于保证用户体验至关重要。随着用户基数的增长和业务需求的变化,传统的单点Session管理模式已难以满足需求。本文将探讨如何利用Tomcat实现Session共享,并介绍Non-Sticky模式的概念及其在提高系统灵活性和可靠性方面的优势。
session 共享服务器
什么是Session?
Session是Web应用程序中用于跟踪用户状态的一种机制。它允许服务器存储关于用户的信息,如登录状态、购物车内容等,这些信息在用户的多次请求之间保持一致。然而,在集群环境下,由于用户的请求可能被路由到不同的服务器实例上,确保会话数据的一致性和可访问性变得尤为重要。
MSM 介绍
注意:当前MSM不支持 tomcat11版本
MSM(memcached session manager)提供将Tomcat的session保持到memcached或Redis的程序,可以实现高可用。
项目早期托管在google code,目前在Github。
github 网站链接:https://github.com/magro/memcached-session-manager
支持Tomcat的 6.x、7.x、8.x、9.x
Tomcat的Session管理类,Tomcat版本不同
- memcached-session-manager-2.3.2.jar
- memcached-session-manager-tc8-2.3.2.jar
Session数据的序列化、反序列化类
- 官方推荐kyro
- 在webapp中WEB-INF/lib/下
驱动类
- memcached(spymemcached.jar)
- Redis(jedis.jar)
安装
参考链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中去,这个目录是 $CATALINA_HOME/lib/,对应本次安装就是/usr/local/tomcat/lib。
kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar
Non-Sticky 模式
Non-Sticky 模式工作原理
non-sticky 模式即前端tomcat和后端memcached无关联(无粘性)关系 从msm 1.4.0之后版本开始支持non-sticky模式。 Tomcat session为中转Session,对每一个SessionID随机选中后端的memcached节点n1(或者n2)为主 session,而另一个memcached节点n2(或者是n1)为备session。产生的新的Session会发送给主、备 memcached,并清除本地Session。
后端两个memcached服务器对一个session来说是一个是主,一个是备,但对所有session信息来说每个 memcached即是主同时也是备。
如果n1下线,n2则转正。n1再次上线,n2依然是主Session存储节点。
Memcached 配置
放到 $CATALINA_HOME/conf/context.xml 中
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManage