Tomcat基于MSM+Memcached实现Session共享

前言

在Tomcat集群中,当一个节点出现故障,其他节点该如何接管故障节点的Session信息呢?本文带来的解决方案是基于MSM+Memcached实现Session共享。

相关介绍

MSM

MSM–Memcached Session Manager是一个高可用的Tomcat Session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用Memcached存取Session,以实现高可用。

工作原理

Sticky Session(黏性) 模式下的工作原理

安装在Tomcat上的MSM使用本机内存保存Session,当一个请求执行完毕之后,如果对应的Session在本地不存在(即某用户的第一次请求),则将该Session复制一份至Memcached;当该Session的下一个请求到达时,会使用Tomcat的本地Session,请求处理结束之后,Session的变化会同步更新到 Memcached,保证数据一致。

当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session信息,于是从Memcached查找该Session,更新该Session并将其保存至本机。此次请求结束,Session被修改,送回Memcached备份。

Non-sticky Session (非黏性)模式下的工作原理

收到请求,加载备Session至本地容器,若备Session加载失败则从主Session加载

请求处理结束之后,Session的变化会同步更新到Memcached,并清除Tomcat本地Session

实现过程

实验拓扑

Tomcat基于MSM+Memcached实现Session共享.jpg

nginx安装配置

为nginx提供SysV init脚本

为脚本赋予执行权限

添加至服务管理列表,并让其开机自动启动

配置nginx

tomcat安装配置

安装jdk

安装tomcat

提供脚本

访问测试

准备测试页

1.jpg

2.jpg

3.jpg

4.jpg

此时Session信息并不一致,接下来我们通过配置MSM实现Session共享

memcached安装

提供脚本

授权并启动服务

tomcat配置

将所需jar包放入各tomcat节点的tomcat安装目录下的lib目录中

将配置文件同步至另一节点

访问测试

5.jpg

6.jpg

由此可见,Session共享已实现,下面我们模拟TomcatB节点故障,看一下Session是否会发生改变

7.jpg

虽然因为TomcatB故障,导致用户请求被调度到了TomcatA节点上,但Session ID并未发生改变,即Session集群内的所有节点都保存有全局的Session信息,很好的实现了用户访问的不中断

当n2(memcached)节点发生故障,Session信息会不会转移到其他memcached节点呢,我们来试一下

8.jpg

Session已转移到n1上,而且Session ID并未发生改变,至此,Tomcat基于MSM+Memcached实现Session共享目的已实现

The end

Tomcat基于MSM+Memcached实现Session共享实验就说到这里了,实验过程中遇到问题可留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~

原创文章,作者:书生,如若转载,请注明出处:/5984

评论列表(12条)

  • bun 2015-07-19 12:38

    为什么我设置后,2个tomcat显示的sessionid不同?
    Session ID A14E6BC4D742B22CEBDFB1D46A85A5A1-n1
    Session ID 578EFEAAEEEE8B85812498547E0FE283-n1

    javolution-5.4.3.1.jar msm-javolution-serializer-1.8.1.jar
    memcached-session-manager-1.8.1.jar spymemcached-2.10.2.jar
    memcached-session-manager-tc7-1.8.1.jar
    这几个包的版本有要求吗? 我都用了最新版本的。

    • 书生
      书生 2015-07-20 10:21

      与msm相关的版本要一致,也要与tomcat版本一致

      • bun 2015-07-20 15:34

        memcached-session-manager-1.8.3.jar
        memcached-session-manager-tc7-1.8.3.jar
        spymemcached-2.11.1.jar
        javolution-5.4.3.1.jar
        msm-javolution-serializer-1.8.3.jar

        这个版本组合有问题吗?

        我发现通过不同tomcat实例直接访问的话,session是一致的。
        但是经过nginx做了负载均衡以后,每次刷新的时候,每个实例都得到不同的session值。
        这个可能是哪里配置的问题?

        • bun 2015-07-20 15:52

          no-sticky 模式

        • bun 2015-07-20 15:53
        • 书生
          书生 2015-07-20 15:59

          你在从头捋一遍 或者看看视频看哪里有没有遗漏 如果按以上配置一般不会出现问题 刷新时间间隔太长或者清除了本地缓存

          • bun 2015-07-20 17:03

            tomcat实例访问地址是 http://1.2.3.4:8080/test/session.jsp 和 http://1.2.3.4:18080/test/session.jsp
            nginx的配置是

            upstream tomcat {
            server 12.3.4:8080;
            server 1.2.3.4:18080;
            }

            http://www.xxx.com
            proxy_pass http://tomcat/test/;

            用 http://www.xxx.com/session.jsp 可以访问
            但是这样的话,session就每次刷新都变

            修改为
            http://www.xxx.com
            proxy_pass http://tomcat/;

            用http://www.xxx.com/test/session.jsp 可以访问,session也不变了。
            但是路径都了 /test/

            如何解决前者的配置问题?

    • 书生
      书生 2015-07-20 17:16

      我为何看不懂你nginx的配置

      • bun 2015-07-20 17:33

        proxy_pass http://tomcat/ 和
        proxy_pass http://tomcat/test 的区别

      • bun 2015-07-20 18:25

        页面地址,在tocamcat是带路径的
        http://1.2.3.4:8080/test/session.jsp
        但是nginx是代理顶级域名 http://www.xxx.com/session.jsp

        所以我用了 proxy_pass http://tomcat/test
        这样配置,导致通过nginx访问的时候,session不停变化

        proxy_pass http://tomcat/ 的话,就正常,但是访问地址多了test路径
        http://www.xxx.com/test/session.jsp

    • 书生
      书生 2015-07-20 18:29

      在意这个干啥 如果你非要纠结 回顾下nginx的知识就明白了 能自己解决尽量自己解决

  • stanley
    stanley 2016-03-27 21:51

    书生出品,必属精品,现在才置顶是我的问题~

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达主管  万达娱乐直属  万达娱乐主管  万达直属QQ  万达娱乐主管  万达娱乐登录  万达娱乐招商  万达招商QQ  万达直属