java集群之session共享解決方案

2021-08-27 23:27:07 字數 3338 閱讀 6834

一、提出問題:

為了滿足足夠大的應用,滿足更多的客戶,於是我們架設了n臺web伺服器(n>=2),在多台web伺服器的情況下,我們會涉及到乙個問題:使用者登陸一台伺服器以後,如果在跨越到另一台伺服器的時候能夠繼續使用客戶的session?

二、解決方案:

集群中session安全和同步是個最大的問題,下面是收集到的幾種session同步的方案,希望能通過分析其各自的優劣找出其適應的場景。

1. 客戶端cookie加密

這是我以前採用的方式,簡單,高效。比較好的方法是自己採用cookie機制來實現乙個session,在應用中使用此session實現。

問題:session中資料不能太多,最好只有個使用者id。

參考實現:

當使用者登陸成功以後,把**網域名稱、使用者名稱、密碼、token、 session有效時間全部採用cookie的形式寫入到客戶端的cookie裡面,如果使用者從一台web伺服器跨越到另一台伺服器的時候,我們的程式主動去檢測客戶端的cookie資訊,進行判斷,然後提供對應的服務,當然,如果cookie過期,或者無效,自然就不讓使用者繼續服務了。當然,這種方法的弊端就不言而喻了,比如客戶端禁用了cookie或者cookie被黑客竊取了呢?這些都可以解決,目前**session框架就是基於client cookie做開發,不見得他們就出了很大的問題?也許是最可行的方式,可以配合memcached來實現

可能大部分應用伺服器都提供了session複製的功能來實現集群,tomcat,jboss,was都提供了這樣的功能。

問題:

效能隨著伺服器增加急劇下降,而且容易引起廣播風暴;

session資料需要序列化,影響效能。

如何序列化,可以參考 物件的序列化和反序列化.

參考資料:

tomcat 5集群中的session複製一

tomcat 5集群中的session複製二

應用伺服器-jboss 4.0.2集群指南

3. 使用資料庫儲存session

使用資料庫來儲存session,就算伺服器宕機了也沒事,session照樣在。

問題:

程式需要定製;

每次請求都進行資料庫讀寫開銷不小(使用記憶體資料庫可以提高效能,宕機就會丟失資料。可供選擇的記憶體資料庫有berkeleydb,mysql的記憶體表);

資料庫是乙個單點,當然可以做資料庫的ha來解決這個問題。

這個方式與nfs的方式類似,也是採用一台mysql伺服器做共享伺服器,把所有的session的資料儲存到mysql伺服器上,所有web伺服器都來這台mysql伺服器來獲取session 資料。缺點也是依賴性太強,mysql無法工作了影響所有的web伺服器,當然,可以考慮多太mysql資料庫來共享session,使用同步mysql 資料的方式。這種方式跟方式3類似,同樣可以採用memcached來做,nosql也可以實現,這些都不是問題

4. 使用共享儲存來儲存session

和資料庫類似,就算伺服器宕機了也沒事,session照樣在。使用nfs或windows檔案共享都可以,或者專用的共享儲存裝置。

問題:

程式需要定製;

頻繁的進行資料的序列化和反序列化,效能是否有影響;

共享儲存是乙個單點,這個可以通過raid來解決。

其實這個方案和上面的mysql方案類似,只是儲存方式不一 樣。大致就是有一台公共的nfs伺服器(network file server)做共享伺服器,所有的web伺服器登陸的時候把session資料寫到這台伺服器上,那麼所有的session資料其實都是儲存在這台 nfs伺服器上的,不論使用者訪問哪台web伺服器,都要來這台伺服器獲取session資料,那麼就能夠實現共享session資料了。缺點是依賴性太強,如果nfs伺服器down掉了,那麼大家都無法工作了,當然,可以考慮多台nfs伺服器同步的形式。這個方案都可以解決,目前zookeeper可以實現,當然memcached也可以實現session共享。

5. 使用memcached來儲存session

這種方式跟資料庫類似,不過因為是記憶體訪問的,效能自然要比資料庫好多了。

問題:

程式需要定製,增加了工作量;

存入memcached中的資料都需要序列化,效率較低;

memcached伺服器一死,所有session全丟。memchached能不能做ha? 我也不知道,**上沒提。

參考資料:

應用memcached儲存session會話資訊

正確認識memcached的快取失效

擴充套件tomcat 6.x,使用memcached存放session資訊

6. 使用terracotta來儲存session

跟memcached類似,但是資料不需要序列化,並且是find-grained changes,效能更好。配置對原來的應用完全透明,原有程式幾乎不用做任何修改。而且terracotta本身支援ha。

問題:terracotta的ha本身進行資料複製效能如何?

參考資料:

jvm-level clustering

terracotta集群tomcat實現session同步

使用terracotta和tomcat建立active-passive模式的集群

用spring web flow和terracotta搭建web應用

terracotta實戰示例——集群rife

7. 伺服器之間session資料同步的方式

假設web伺服器a是所有使用者登陸的伺服器,那麼當使用者驗證登陸一下,session資料就會寫到a伺服器裡,那麼就可以自己寫指令碼或者守護程序來自動把session資料同步到其他web伺服器,那麼當使用者跳轉到其他伺服器的時候,那麼session資料是一致的,自然就能夠直接進行服務無須再次登陸了。缺點是,可能會速度慢,不穩定,如果是單向同步的話,登陸伺服器出現問題,那麼其他伺服器也無法服務,當然也可以考慮雙向同步的問題。這個方案都可以解決,目前zookeeper可以實現。

8. 使用硬體裝置

這個算是比較成熟的解決方案了,使用類似big-ip的負載裝置來實現資源共享,那麼就能夠又穩定又合理的的共享session了。目前很多門戶**採用這種方式。缺點很明顯了,就是要收費了,硬體裝置肯定需要購買成本的,不過對於專業或者大型應用來講,是比較合理並且值得的,這種方式可以放到最後面考慮

Java集群之session共享解決方案

隨著網際網路的日益壯大,的pv和uv成線性或者指數倍的增加.單伺服器單資料庫早已經不能滿足實際需求.比如像盛大,這樣的大型網路公司,更是如此.集群,也就是讓一組計算機伺服器協同工作,達解決大併發,大資料量瓶頸問題.但是在群集中,session往往是乙個比餃頭疼的問題.一般情況下,session不可跨...

Java集群之session共享解決方案

隨著網際網路的日益壯大,的pv和uv成線性或者指數倍的增加.單伺服器單資料庫早已經不能滿足實際需求.比如像盛大,這樣的大型網路公司,更是如此.集群,也就是讓一組計算機伺服器協同工作,達解決大併發,大資料量瓶頸問題.但是在群集中,session往往是乙個比餃頭疼的問題.一般情況下,session不可跨...

Java集群之session共享解決方案

隨著網際網路的日益壯大,的pv和uv成線性或者指數倍的增加.單伺服器單資料庫早已經不能滿足實際需求.比如像盛大,這樣的大型網路公司,更是如此.集群,也就是讓一組計算機伺服器協同工作,達解決大併發,大資料量瓶頸問題.但是在群集中,session往往是乙個比餃頭疼的問題.一般情況下,session不可跨...