使用Tomcat-redis-session-manager來實現Tomcat集羣部署中的Session共享

1、工做中由於要使用到Tomcat集羣部署,此時就涉及到了Session共享問題,主要有三種解決方案:html

  一、使用數據庫來存儲Sessionjava

  二、使用Cookie來存儲Sessionnginx

  三、使用Redis來存儲Sesssiongit

  四、使用Tomcat的session複製github

  五、使用Memcached來存儲Sessionweb

2、本文中主要講一下第3種方案,也就是使用Redis來存儲Session,Github中已經有該開源組件(Tomcat-redis-session-manager),下面講一下配置的步驟:redis

  一、環境準備spring

    Tomcat7 下載地址:http://tomcat.apache.org/download-70.cgi數據庫

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

    本文使用的Nginx來作的Tomcat集羣。

           Nginx安裝參考:Linux Centos 6.5_x86安裝Nginx

    Redis安裝參考:轉:Centos6.5_x86安裝Redis

  二、配置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優先級有關?)

  三、添加Tomcat-redis-session-manager的jar包到tomcat/lib目錄下,須要的jar包以下:

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

三、在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

相關文章
相關標籤/搜索