程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Redis存儲Tomcat集群的Session,redistomcat

Redis存儲Tomcat集群的Session,redistomcat

編輯:JAVA綜合教程

Redis存儲Tomcat集群的Session,redistomcat


                Redis存儲Tomcat集群的Session

如何

  做到把新開發的代碼推送到到生產系統中部署,生產系統要能夠零宕機、對使用用戶零影響。

設想

  是使用集群來搞定,通過通知負載均衡Nginx,取下集群中的Tomcat節點,然後對Tomcat上的應用進行升級,再通知負載均衡Nginx,把Tomcat節點重新加載上去。依次這麼做,把集群中的所有Tomcat都替換一次即可。

那麼問題來了

  在取下Tomcat節點和加載新Tomcat節點時如何做到對用戶無影響呢?方法很簡單,共享Session。

下面

  我們用實例來說明此方案。我們的例子使用了一台Nginx做負載均衡,後端掛接了兩台Tomcat,且每台Tomcat的Session會話 都保存到Redis數據庫中。其中,Nginx配置為non-sticky運行模式,也即每一個請求都可以被分配到集群中的任何節點。當要上線新代碼時, 只需簡單地取下Tomcat實例,此時所有的訪問用戶會被路由到活動的Tomcat實例中去,而且由於會話數據都是保存在Redis數據庫中,所以活躍用 戶並不會受影響。當Tomcat更新完畢,又可以把此節點加入到Nginx中。

安裝Nginx

  # sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm

修改配置文件/etc/nginx/nginx.conf,並添加下面的內容:

http {
upstream tomcat  {
        server localhost:8080;
        server localhost:8081;
    }
include      /etc/nginx/mime.types;
default_type  application/octet-stream;

修改配置文件/etc/nginx/conf.d/default.conf並替換location部分的內容:

location / {
    proxy_pass  http://tomcat;
  }

 

重啟Nginx

# sudo service nginx restart

 

接下來

  安裝兩個Tomcat實例。由於我們是在同一台服務器上做的演示,要讓兩台Tomcat不發生沖突,需要修改第二個Tomcat實例的端口 號。由於Nginx配置為non-sticky運行模式,對每個請求采用的是Round-robin負載均衡方式,這意味著它會為每個請求都抽獎一個新會 話。

接著,下載並安裝Redis。步驟省略,很簡單。

最後

  我們需要配置Tomcat,讓Tomcat把會話Session保存到Redis數據庫。

我們要使用tomcat-redis-session-manager這樣的第三方庫,主頁見:https://github.com/jcoleman/tomcat-redis-session-manager

 

注意

  此庫並非開箱即用的,使用時需要做一些調整。你需要下載源碼,並在更新了依賴庫的版本後,重建項目。比如我使用了commons- pool2-2.2.jar和jedis-2.6.1.jar依賴庫。要記住把這些jar文件復制到每一個Tomcat實例的lib子目錄下。


  
https://github.com/xetorthio/jedis/downloads下載jedis作為java的redis客戶端,

  
https://github.com/jcoleman/tomcat-redis-session-manager/downloads下載tomcat的redis session manager插件,

  
http://commons.apache.org/proper/commons-pool/download_pool.cgi下載apache的common pool包,

  
這幾個jar包拷貝到tomcat7的lib目錄下。並在修改每一個Tomcat實例的context.xml配置文件:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
        host="localhost"
        port="6379"
        database="0"
        maxInactiveInterval="60" />

 

重啟Tomcat實例

  可以檢查到Redis確實保存了Tomcat的會話。然後我們對Tomcat實例取下或恢復時,訪問用戶確實沒受影響。

 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved