基于memcached-session-manager的tomcat session共享集群

MSM的特性:

a、支持tomcat 6,tomcat 7,tomcat 8

b、支持sticky session或no-sticky session

c、无单点故障

d、tomcat故障转移

e、memcached故障转移

f、附带串行化插件

g、支持异步session存储,拥有更快的性能

sticky sessions粘性会话:

安装了MSM的tomcat会优先使用本机内存保存session,当一个请求结束后,MSM会把session发送到memcached节点上存放以作备份,第二次请求时,如果本地有session就直接返回,第二次请求结束,把session修改后的信息更新到后端的memcached服务器,以这样的方式来保持本地的session与memcached上的session同步。当这个tomcat节点宕机时,那么用户的下一次请求就会被前端的负载均衡器路由到另一个tomcat节点上,而这个节点上并没有这个用户的session信息,这个节点就从memcached服务器上去读取session,并把session保存到本地的内存,当请求结束,session又被修改,再送回到memcached进行存放备份

当后端配置了多台memcached时,MSM在更新session信息时会同时向多个memcached节点更新session,当一个memcached节点故障时,tomcat可以从选择一个正常工作的memcached节点读取session信息来发送给用户的浏览器,让其重置session信息,这样,memcached也达到了高可用的目的

non-sticky session非粘性会话:

tomcat session为中转session, 假设memcached1为主session ,memcached2 为备session。Request请求到来时,从memcached2加载备session到tomcat,如果memcached2没有就从memcached1上读取session,如果memcached1也没有就读取本地session,如果没有本地session就在本地创建,当请求结束时,将本地的session更新至memcached1和memcached2上,并且清除本地的session

jdk安装:

tomcat7安装:

memcached安装:

参考:Memcached安装和配置

libevent版本:libevent-2.0.22-stable

memcached版本:memcached-1.4.36

序列化策略:

1、内置的JAVA序列化

transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"

2、kryo序列化:(据说效率最高)

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

3、javolution序列化:

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

4、xstream序列化:

5、flexjson序列化:

序列化所需jar包:

1、内置的JAVA序列化:

memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar
spymemcached-2.12.2.jar

2、kryo序列化:

msm相关:
        memcached-session-manager-2.1.1.jar
        memcached-session-manager-tc7-2.1.1.jar(tomcat7使用)
        spymemcached-2.12.2.jar
kryo序列化相关:
        asm-5.2.4.jar
        kryo-4.0.0.jar
        kryo-serializers-0.39.jar
        minlog-1.3.jar
        msm-kryo-serializer-2.1.1.jar
        reflectasm-1.09.jar
jar包下载地址:
    memcached-session-manager-2.1.1.jar,memcached-session-manager-tc7-2.1.1.jar,msm-kryo-serializer-2.1.1.jar:http://repo1.maven.org/maven2/de/javakaffee/msm
    spymemcached-2.12.2.jar:http://repo1.maven.org/maven2/net/spy/
    asm-5.2.4.jar:http://www.java2s.com/Code/Jar/a/asm.htm
    kryo-4.0.0.jar,minlog-1.3.jar,reflectasm-1.09.jar:http://maven.outofmemory.cn/com.esotericsoftware/
    kryo-serializers-0.39.jar:http://maven.outofmemory.cn/de.javakaffee/

3、javolution序列化:

msm相关:
        memcached-session-manager-2.1.1.jar
        memcached-session-manager-tc7-2.1.1.jar(tomcat7使用)
        spymemcached-2.12.2.jar
javolution序列化相关:
        msm-javolution-serializer-2.1.1.jar 
        javolution-5.5.1.jar

jar包下载地址:
    msm-javolution-serializer-2.1.1.jar:http://repo1.maven.org/maven2/de/javakaffee/msm
    javolution-5.5.1.jar:http://www.java2s.com/Code/JarDownload/javolution/

4、xstream序列化:

msm相关:
        memcached-session-manager-2.1.1.jar
        memcached-session-manager-tc7-2.1.1.jar(tomcat7使用)
        spymemcached-2.12.2.jar
xstream序列化相关: 
        msm-xstream-serializer
        xstream
        xmlpull
        xpp3_min

5、flexjson序列化:

msm相关:
        memcached-session-manager-2.1.1.jar
        memcached-session-manager-tc7-2.1.1.jar(tomcat7使用)
        spymemcached-2.12.2.jar
flexjson序列化相关: 
        msm-flexjson-serializer
        flexjson

序列化验证:

内置的JAVA序列化 和 javolution序列化 测试验证通过

kryo序列化 测试一直报错未解决

xstream序列化 和 flexjson序列化 未测试

配置:(采用 javolution序列化)

1、将 javolution-5.5.1.jar,memcached-session-manager-2.1.1.jar,memcached-session-manager-tc7-2.1.1.jar,msm-javolution-serializer-2.1.1.jar,spymemcached-2.12.2.jar 这5个jar包放到tomcat的lib目录下(如:/usr/local/tomcat7/lib)

2、修改 /usr/local/tomcat7/conf/context.xml 文件

##sticky sessions粘性会话

<Context>
........

        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="memcached1:192.168.231.134:22121,memcached2:192.168.231.132:22121"
             failoverNodes="memcached1"
             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
             transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
.......
</Context>

##failoverNodes="memcached1"告诉MSM优先从memcached2获取session数据,当memcached2不可用时才从memcached1获取session数据
##non-sticky session非粘性会话(sticky="false")

<Context>
.......
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="memcached1:192.168.231.134:22121,memcached2:192.168.231.132:22121"
             sticky="false"
             sessionBackupAsync="false"
             lockingMode="uriPattern:/path1|/path2"
             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
             transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
........
</Context>

##sticky="false"

测试:(sticky sessions粘性会话)

failoverNodes="memcached1"

tomcatA:192.168.231.132

tomcatB:192.168.231.134

tomcatA:

[[email protected] test]# pwd
/usr/local/tomcat7/webapps/test
[[email protected] test]# vim index.jsp 
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="blue">TomcatA</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("192.168.231.132","192.168.231.132"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

tomcatB:

[[email protected] test]# pwd
/usr/local/tomcat7/webapps/test
[[email protected] test]# vim index.jsp 
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("192.168.231.134","192.168.231.134"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

nginx作负载:

192.168.231.132

由上可以看出两台tomcat保存的sessionID是一致的,memcached使用的是memcached2

关闭memcached2:

由上可以看出两台tomcat保存的sessionID没变化,memcached使用的是memcached1,memcached是高可用的



   继续关闭memcached1

换一个浏览器访问

由上可以看出两台tomcat保存的sessionID不一致了,此时采用的是tomcat本地session数据




启动memcached1

由上可以看出两台tomcat保存的sessionID又一致了,memcached使用的是memcached1

时间: 2024-10-18 21:25:31

基于memcached-session-manager的tomcat session共享集群的相关文章

部署tomcat负载均衡集群,实现节点之间内存中的Session共享。

在实验之前先来了解下tomcat会话管理器(Manager) Manger对象用于实现HTTP会话管理的功能,介绍下几种常见的: 1.StandardManager(标准会话管理器) 用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理.当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件.如果tomcat正常关闭会话不会丢失,如果是tomcat主机崩溃或者进程崩溃那会话是一定会丢失的. 2.Persist

Apache + Tomcat + mod_jk实现集群服务及session共享

实现效果:用apache 分发请求到tomcat中的对应的项目 原理: 环境说明: 操作系统:win7   64位 Javajdk: 1.7 Apache:httpd-2.2.25-win32-x86-no_ssl.msi    (本地安装路径:D:\Program Files (x86)\Apache2.2\)Tomcat: 7.0.42  ( http://tomcat.apache.org/download-70.cgi ),如果在同一台机器上模拟,下载zip版本. 实例中展示了2个节点m

Spark运行模式_基于YARN的Resource Manager的Custer模式(集群)

使用如下命令执行应用程序: 和"基于YARN的Resource Manager的Client模式(集群)"运行模式,区别如下: 在Resource Manager端提交应用程序,会生成SparkSubmit进程,该进程只用来做Client端,应用程序提交给集群后,就会删除该进程. Resource Manager在集群中的某个NodeManager上运行ApplicationMaster,该AM同时会执行driver程序.紧接着,会在各NodeManager上运行CoarseGrain

Windows下Apache+Tomcat实现应用集群

Windows下Apache+Tomcat实现应用集群1 环境依赖:windows.jdk1.6.Apache2.2.tomcat6.02 Jdk1.6安装2.1 略3 安装Apache(2.2.27)3.1 下载:从Apache官网http://httpd.apache.org/download.cgi下载httpd-2.2.25-win32-x86-openssl-0.9.8y.msi:3.2 安装:双击上一步下载的安装程序,持续下一步直到完成:安装向导成功完成,左面右下角托盘中会出现Apa

Linux下使用Apache的Httpd+Mod_jk+Tomcat搭建Web集群服务

Linux下使用Apache的Httpd+Mod_jk+Tomcat搭建Web集群服务 目的 ?? 使用多个tomcat服务器来对请求进行分流,防止单个服务器压力过重.这里为了简单,只使用两个tomcat. 软件 apache httpd-2.2.31(下载地址:https://httpd.apache.org/download.cgi) apache tomcat-7.0.69(下载地址:https://tomcat.apache.org/download-70.cgi) tomcat-con

tomcat+nginx+redis集群试验

Nginx负载平衡 + Tomcat + 会话存储Redis配置要点 使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运营效果.因为将会话存储在Redis中,因此Nginx就不必配置成stick粘粘某个Tomcat方式,这样才能真正实现后台多个Tomcat负载平 衡,用户请求能够发往任何一个tomcat主机,当我们需要部署新应用代码时,只要停止任何一台tomcat,所有当前在线用户都会导向到运行中的 tomcat实例,因

Apache + Tomcat + mod_jk实现集群服务

Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制. 实现效果:用apache 分发请求到tomcat中的对应的项目 环境说明: 操作系统:window xp Javasdk: 1.7 Apache: 2.2.14    (本地安装路径:D:\Apache2.2\) Tomcat: 7.0.42  ( http://tomcat.apache.org/download-70.cgi ),如果在同一台机器上模拟,下载zip版本. 实例中展示了2个节点 mod_jk

基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.6.集群管理命令

3.6. 集群管理命令 3.6.1. RAC的启动与关闭 oracle rac默认会开机自启动,如需维护时可使用以下命令: 关闭: crsctl stop cluster 停止本节点集群服务 crsctl stop cluster –all 停止所有节点服务 开启: crsctl start cluster 开启本节点集群服务 crsctl stop cluster –all 开启所有节点服务 注:以上命令需以 root用户执行 3.6.2.RAC检查运行状况 以grid 用户运行 [[emai

基于Corosync + Pacemaker+DRBD实现MySQL高可用集群

前言 在众多的高可用集群解决方案中,除了Heartbeat之外,Corosync也能提供类似于Heartbeat一样的功能,而且目前RedHat官方提供的高可用集群解决方案的程序包都以Corosync为主,所以在未来的日子Corosync会逐渐取代Heartbeat.本文带来的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解决方案. 相关介绍 Corosync Corosync是从OpenAIS中分支出来的一个项目,它在传递信息的时候可以通过一个简单的配置文件来定

使用Apache通过JK实现多Tomcat负载均衡集群时,Apache不能将请求分发给Tomcat处理(即Apache反向代理不成功)的问题

前些天在做Apache通过JK实现多Tomcat负载均衡集群时,参考网上的配置将配置文件配置好后,访问已存在tomcat中的JSP文件时发现Apache提示URL不存在,然后检查了配置文件及tomcat工程部署,发现配置部署均无问题.尝试访问Apache静态页面,通过http单独访问tomcat均无问题.然后我猜会不会之前参考的网上的配置有问题,于是继续查询网上其它配置发现都差不多,尝试更改各种参数均没有解决.后来我仔细想了想出现这个问题的原因应该是Apache没有将HTTP请求分发给Tomca