zoukankan      html  css  js  c++  java
  • 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

    一、工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案:

      1、使用数据库来存储Session

      2、使用Cookie来存储Session

      3、使用Redis来存储Sesssion

      4、使用Tomcat的session复制

      5、使用Memcached来存储Session

    二、本文中主要讲一下第3种方案,也就是使用Redis来存储Session,Github中已经有该开源组件(Tomcat-redis-session-manager),下面讲一下配置的步骤:

      1、环境准备

        Tomcat7 下载地址:http://tomcat.apache.org/download-70.cgi

        Tomcat-redis-session-manager 下载地址:http://pan.baidu.com/s/1bokMOVH

        本文使用的Nginx来做的Tomcat集群。

               Nginx安装参考:Linux Centos 6.5_x86安装Nginx

        Redis安装参考:转:Centos6.5_x86安装Redis

      2、配置tomcat配置文件context.xml

    复制代码
       <!-- host="192.168.159.129"       Redis地址 -->
        <!-- port="6379"                  Redis端口 -->
        <!-- password="123456"            Redis密码 -->
        <!-- database="0"                 存储Session的Redis库编号 -->
        <!-- maxInactiveInterval="60"     Session失效的间隔(秒) -->
        
        <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />        
        <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" 
            host="192.168.159.129"       
            port="6379"                 
            password="123456"            
            database="0"                 
            maxInactiveInterval="60" />
    复制代码

      注:

      1)Manager节点中的className属性为必选项,其它均为可选项

      2)maxInactiveInterval设置不生效,暂时找不到原因,在部署中发现Session失效的间隔一直都是读取tomcat/conf/web.xml中的session-config节点中配置的session-timeout属性值,且都是以秒为单位,(这个地方maxInactiveInterval好像不起作用,和web.xml中配置的session-config优先级有关?)

      3、添加Tomcat-redis-session-manager的jar包到tomcat/lib目录下,需要的jar包如下:

        commons-pool2-2.2.jar
        jedis-2.5.2.jar
        tomcat-redis-session-manage-tomcat7.jar

    3、在nginx中配置负载均衡,配置文件为nginx.conf

    复制代码
      http {
          upstream myServer {
            server 192.168.1.2:8080;
              server 192.168.1.3:8080;
          }
           server {
           listen 80;
           server_name localhost;
           location / {
             proxy_pass http://myServer;
           }
    } }
    复制代码

      配置完后,访问localhost的请求都将被转发到192.168.1.2:8080以及192.168.1.3:8080中去,可以在Jsp页面中打印一下Session Id验证一下:

      Session Id : <%= request.getSession().getId() %>

       如果在同一个浏览器页面上不断刷新访问,SessionId的值不变化的话,说明配置正确,此时获取的是同一个Session对象。

       也可以通过redis客户端连接到Redis库中直接查看:查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。

      

      注:

      1)GitHub中该开源组件(Tomcat-redis-session-manager)的主页:https://github.com/jcoleman/tomcat-redis-session-manager

      2)该组件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本

      3)在程序中将对象放到Redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口,所以在使用request.getSession().setAttribute()方法时,一定要注意一下这一个细节。

      4)因为要把Tomcat-redis-session-manager的jar包放到Tomcat/lib中,对Tomcat的部署造成了侵入,可以使用Spring Session来替代,spring-session使用拦截器重新包装了request从而替换session实现

      5)因为所有集群的Tomcat中配置的Redis地址是一个,如果Redis崩溃了,那么Session就不可用了,所以需要部署Redis集群,实现故障自动切换,高可用的目标。

      keepalived+redis 高可用redis主从解决方案

    文章参考自:

        1.https://my.oschina.net/kolbe/blog/618167

        2.http://www.cnblogs.com/lengfo/p/4260363.html

  • 相关阅读:
    shell进行mysql统计
    java I/O总结
    Hbase源码分析:Hbase UI中Requests Per Second的具体含义
    ASP.NET Session State Overview
    What is an ISAPI Extension?
    innerxml and outerxml
    postman
    FileZilla文件下载的目录
    how to use webpart container in kentico
    Consider using EXISTS instead of IN
  • 原文地址:https://www.cnblogs.com/wuchangsoft/p/10339503.html
Copyright © 2011-2022 走看看