Tomacat session 共享复制

Posted njsummer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomacat session 共享复制相关的知识,希望对你有一定的参考价值。

1. msm 介绍

msm(memcached session manager)提供将Tomcat的session保持到memcached或redis的程序,可以实现高可用。项目早期托管在google code,目前在Github

github网站链接: https://github.com/magro/memcached-session-manager

Tomacat

支持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)


2. sticky 和 non-sticky 两种工作模式

2.1 sticky工作模式

sticky工作模式:在Tomcat本机上(t1)存一份session,在后端的session共享器 (memcached或者redis)m2上(一般为交叉节点)也存放一份副本,当m2故障了,新session会被写入到t1 和 m1 上去,同时m2故障发生同时还存活在t1上的session 还会被写到m1 上去。t2接收的session同样的方式被存放和容错。

The following description shows an example for a setup with sticky sessions, with two instances of tomcat and two instances of memcached installed.

Tomcat-1 (t1) will primarily store its sessions in memcached-2 (m2) which is running on another machine (m2 is a regular node for t1). Only if m2 is not available, t1 will store its sessions in memcached-1 (m1, m1 is the failoverNode for t1). With this configuration, sessions wont be lost when machine 1 (serving t1 and m1) crashes. The following really nice ASCII art shows this setup.

<t1> <t2>
. \\ / .
. X .
. / \\ .
<m1> <m2>
#以下是sticky的配置   修改 $CATALINA_HOME/conf/context.xml   特别注意,tomcat 节点上的修改内容有些差异  t1配置中为failoverNodes="n1", t2配置为failoverNodes="n2"

<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.0.38:11211,n2:172.16.0.48:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFac
tory"
/>
</Context>
实践的实验过程中,t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。
当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session;如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在
memcached1中。

# 配置说明
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
memcached的节点: n1、n2只是别名,可以重新命名。
failoverNodes 为故障转移节点,n1是备用节点,n2是主存储节点。另一台Tomcat将n1改为n2,其主节
点是n1,备用节点是n2。

2.2 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存储节点。

# non-sticky 模式  修改 $CATALINA_HOME/conf/context.xml   tomcat的节点上的配置修改内容一样
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.0.38:11211,n2:172.16.0.48:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFac
tory"
/>
</Context>




3. 需要在$CATALINA_HOME/lib/目录下部署的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 # 这个依据tomcat的版本需要选择不同的jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar


4. 安装配置

安装调试一般分以下几个主要步骤:

第一步:先配置好前端的反向代理服务器(nginx 、HAPROXY 、HTTPD等都可以);

第二步:配置好几个 tomcat  节点,并与前端的反向代理构建好集群;

第三步:配置session 的持久保存和同步,本文的主要内容就是介绍第三步,详细的教程在下面的官网连接上有详细的介绍。

官方的安装配置教程: ​​https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration​




以上是关于Tomacat session 共享复制的主要内容,如果未能解决你的问题,请参考以下文章

(转)tomcat+nginx+redis实现均衡负载session共享

Redis主从复制实现session共享

Tomacat-安装详解

#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

使用redis实现session复制

Spring Boot 多站点利用 Redis 实现 Session 共享