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

来源:互联网 发布:tplink端口转发不生效 编辑:程序博客网 时间:2024/04/29 16:55
一、需求
    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包
<span style="font-family:Microsoft YaHei;font-size:14px;"> <dependency>     <groupId>de.javakaffee.msm</groupId>     <artifactId>msm-kryo-serializer</artifactId>     <version>1.8.3</version></dependency></span>
4. Tomcat配置

<span style="font-family:Microsoft YaHei;font-size:14px;"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"      memcachedNodes="n1:172.16.0.67:11211"      sticky="false"      sessionBackupAsync="false"      lockingMode="uriPattern:/path1|/path2"      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /></span>
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,以达到主备同步之目的。


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 。以达到主备同步之目的。



这里推荐使用Maven自动依赖获取相关jar包
0 0
原创粉丝点击