Tomcat集群--基于Memcached的Session共享

一、需求
    Tomcat部署多节点,实现Web应用高可用性,去除Web服务单点故障的隐患,目前可以考虑的方案一般有以下几种:
    1. 使用Tomcat自带的Cluster方式,多个Tomcat间自动实时复制Session信息,根据官网提供配置文档即可实现,配置起来简单,但是这个方案效率比较低,在高并发的下表现并不好
    2. 利用Nginx的基于访问IP的hash路由策略,保证访问的IP始终被路由到同一个Tomcat上,这个配置简单,但如果应用是某一个局域网大量用户同时登陆,这样负载均衡就没什么作用了。(会话保持)
    3. 利用Memcached把多个Tomcat的session集中管理,前端利用Nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时,又能保证较高的性能。
    这里采用方案3进行测试.
二、环境
    系统:Centos 7 X64
    软件:Nginx 1.8.0 memcached-1.4.17.tar Tomcat6
    依赖:libevent-1.4.13-stable.tar

    MSM相关Jar包:获取方式,在Maven公网服务进行Jar最新版本下载

三、准备

1. 配置Tomcat

Tomcat有两个部分需要修改:

  • 添加相关的Jar包至Tomcat安装目录下lib文件夹中,一般为$CATALINA_HOSE/lib下,此处注意:Web应用的WEB-INF/lib下不要放置相关的jar包,否则启动Tomcat会报异常(序列化类异常:java.lang.ClassCastException  de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
  • 修改Tomcat配置文件,一般为$CATALINA_HOME/conf/Context.xml
2. 添加memcached-session-manager jars至Tomcat中
  • memcached-session-manager-${version}.jar    可在Maven公共服务下载http://mvnrepository.com/
  • memcached-session-manager-tc6-${version}.jar  http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc6   Tomcat6 使用
  • memcached-session-manager-tc7-${version}.jar  http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7   Tomcat7 使用
若使用memcached,还需要添加spymemcached-*.*.*.jar
若使用couchbase,还需要添加couchbase-client-*.*.*.jar、jettison-*.*.jar、commons-codec-*.*.jar、httpcore-*.*.*.jar、httpcore-nio-*.*.*.jar、netty-*.*.*.jar


3. Session共享序列化
  • Java内置序列化
memcached-session-manager-1.8.3.jar   已经内置
  • 自定义序列化(提升性能)
  1. kryo-serializer(已测试)
Maven依赖为:

这里推荐使用Maven自动依赖获取相关jar包
 
     de.javakaffee.msm
     msm-kryo-serializer
     1.8.3
4. Tomcat配置

 
5. Memcached集群
若一个memcached节点出现异常,则session会转存至另一个,具体实现待后续进行研究测试(此处后续测试后进行补充)

四:原理

原文:http://xylonwang.iteye.com/blog/1269704,http://miwucc.iteye.com/blog/1329729

MSM(memcached-session-manager) 支持tomcat6 tomcat7 ,利用 ValueTomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载sessionRequest请求结束时,将tomcat session更新至memcached,以达到session共享之目的, 支持 sticky   non-sticky 模式。

1.Sticky 模式:

tomcat session 为主sessionmemcached 为备sessionRequest请求到来时, 从memcached加载备 session tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session)Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。

Tomcat集群--基于Memcached的Session共享_第1张图片

2.Non-Sticky模式:

tomcat session 为 中转session memcached1 为主 session,memcached 2 为备sessionRequest请求到来时,从memcached 2加载备 session  tomcat,(当 容器 中还是没有session 则从memcached1加载主 session tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至 主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的。

Tomcat集群--基于Memcached的Session共享_第2张图片




这里推荐使用Maven自动依赖获取相关jar包

你可能感兴趣的:(Tomcat)