在集群中session安全和同步是個最大的問題,下面是收集到的幾種session同步的方案,希望能通過分析其各自的優劣找出其適應的場景。
1. 客戶端cookie加密
簡單,高效。比較好的方法是自己采用cookie機制來實現一個session,在應用中使用此session實現。
問題:session中數據不能太多,最好只有個用戶id。
參考實現:http://rollerweblogger.org/
2. application server的session復制
可能大部分應用服務器都提供了session復制的功能來實現集群,tomcat,jboss,was都提供了這樣的功能。
問題:
性能隨著服務器增加急劇下降,而且容易引起廣播風暴;
session數據需要序列化,影響性能。
如何序列化,可以參考 對象的序列化和反序列化.
參考資料:
Tomcat 5集群中的SESSION復制一
Tomcat 5集群中的SESSION復制二
應用服務器-JBoss 4.0.2集群指南
3. 使用數據庫保存session
使用數據庫來保存session,就算服務器宕機了也沒事,session照樣在。
問題:
程序需要定制;
每次請求都進行數據庫讀寫開銷不小(使用內存數據庫可以提高性能,宕機就會丟失數據。可供選擇的內存數據庫有BerkeleyDB,Mysql的內存表);
數據庫是一個單點,當然可以做數據庫的ha來解決這個問題。
4. 使用共享存儲來保存session
和數據庫類似,就算服務器宕機了也沒事,session照樣在。使用nfs或windows文件共享都可以,或者專用的共享存儲設備。
問題:
程序需要定制;
頻繁的進行數據的序列化和反序列化,性能是否有影響;
共享存儲是一個單點,這個可以通過raid來解決。
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
Terracotta近況:轉向開源,接受度,Hibernate支持
附:terracotta介紹
Open Terracotta is an enterprise-class, open-source, JVM-level clustering solution. JVM-level clustering simplifies enterprise Java by enabling applications to be deployed on multiple JVMs, yet interact with each other as if they were running on the same JVM. Terracotta extends the Java Memory Model of a single JVM to include a cluster of virtual machines such that threads on one virtual machine can interact with threads on another virtual machine as if they were all on the same virtual machine with an unlimited amount of heap.
posted on 2008-03-06 12:23
lzj520 閱讀(17909)
評論(0) 編輯 收藏 所屬分類:
個人學習日記