1. 程式人生 > >利用tomcat-redis-session-manager解決tomcat的分散式session問題

利用tomcat-redis-session-manager解決tomcat的分散式session問題

[摘要:Redis+Tomcat完成session流程 1.客戶端初次要求辦事端 2.辦事端發生session並set cookie相應給客戶端 3.客戶端再次要求辦事端,會帶上cookie 4.辦事端依據cookie找到對應的session 完成思緒 若是我們]

Redis+Tomcat實現session流程

1.客戶端首次請求服務端

2.服務端產生session並set cookie響應給客戶端

3.客戶端再次請求服務端,會帶上cookie

4.服務端根據cookie找到對應的session

實現思路

如果我們要編寫程式實現這個方案,需要解決以下問題:

1.session的安全性,即不容易被仿造。

2.session的唯一性,如果用tomcat產生session的策略,多臺tomcat會產生的session會存在重複的可能。

3.session的有效期維護,session會有個有效期,使用者在這個時間內不訪問系統,session將會失效,如果

使用者一直訪問,則要自動延長session有效期。

4.在叢集session伺服器中,要考慮負載均衡,這也是需要編寫客戶端程式碼的,在分散式session快取中,

需要根據sessionId雜湊分佈,那麼就和伺服器個數進行了耦合,在新增和移除伺服器的時候,將出現數

據不一致的問題 。

5.如何實現才能讓應用程式改動最小,或者是不改動。

我們可以選擇自己寫程式來實現以上功能,不過在這裡我使用一個現成的框架,即tomcat-redis-session-manager

有時間並感興趣的朋友,可以在這個基礎上自行實現一個,這樣更適合自己的專案。

伺服器部署分佈:

ha主機 192.168.1.227:80

ha備機 192.168.1.246:80

keepalived 主機 192.168.1.227

keepalived備機 192.168.1.246

web1 http://192.168.1.226:8888/login

web2 http://192.168.1.246:8888/login

redis主 192.168.1.245 6380

redis備

安裝redis

主機和備機都安裝redis

wget http://download.redis.io/releases/redis-2.8.5.tar.gz

解壓:

tar xzf redis-2.8.5.tar.gz

cd redis-2.8.5

make

啟動

src/redis-server redis.conf --port 6380 &

客戶端登入

src/redis-cli -p 6380

備機配置複製:

redis.conf檔案中

新增

slaveof 192.168.1.245 6380

Tomcat配置

tomcat版本:7.0.61

相關jar包:

注意這裡的jar包最好是按下面的版本,否則會出現jar包衝突的問題。

tomcat-redis-session-manager-1.1.jar

commons-pool-1.6.jar

jedis-2.1.0.jar

下載tomcat redis session manager

https://github.com/jcoleman/tomcat-redis-session-manager/downloads

下載 apache common pool

http://commons.apache.org/proper/commons-pool/download_pool.cgi

下載版本:tomcat-redis-session-manager-1.1

redis的jar包可以從maven中央倉庫下載

將以上3個jar包放入tomcat/lib目錄中

在tomcat context.xml中加入如下內容

host: optional: defaults to "localhost" --> <!-- port: defaults to "6379" --> <!-- database: optional: defaults to "0" --> <!-- maxInactiveInterval: optional: defaults to "60" (in seconds) --><Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <ManagerclassName="com.radiadesign.catalina.session.RedisSessionManager" host="192.168.1.245"port="6380" database="0" maxInactiveInterval="60" />

啟動tomcat,瀏覽器請求tomcat

http://192.168.1.226:8888/login/

  

登入redis客戶端,檢視session


session已經被儲存到redis

下面,我們進行一項測試

測試流程:

1.先訪問虛擬ip1.99的應用,得到sessionId


web伺服器是226

2.然後將對應的tomcat停掉

3.重新整理該應用,若sessionId未變,則表示redis儲存session成功。


我們發現web伺服器變成了246,但是sessionId未發生變化

該方案將session集中儲存在了redis伺服器,並做了主備容災,從一定程度上提高了系統的高可用,由於

redis是記憶體儲存,訪問效率較高,在效能上也是比較好的,但是本例中session不是分散式儲存,因此當用戶量

非常大,併發訪問量非常高的時候,session伺服器會成為效能瓶頸。