在集群中session安全和同步是個(gè)最大的問題,下面是我收集到的幾種session同步的方案,希望能通過分析其各自的優(yōu)劣找出其適應(yīng)的場景。
這是我以前采用的方式,簡單,高效。比較好的方法是自己采用cookie機(jī)制來實(shí)現(xiàn)一個(gè)session,在應(yīng)用中使用此session實(shí)現(xiàn)。
問題:session中數(shù)據(jù)不能太多,最好只有個(gè)用戶id。
參考實(shí)現(xiàn):http://rollerweblogger.org/
可能大部分應(yīng)用服務(wù)器都提供了session復(fù)制的功能來實(shí)現(xiàn)集群,tomcat,jboss,was都提供了這樣的功能。
問題:
性能隨著服務(wù)器增加急劇下降,而且容易引起廣播風(fēng)暴;
session數(shù)據(jù)需要序列化,影響性能。
如何序列化,可以參考 對(duì)象的序列化和反序列化.
參考資料:
使用數(shù)據(jù)庫來保存session,就算服務(wù)器宕機(jī)了也沒事,session照樣在。
問題:
程序需要定制;
每次請(qǐng)求都進(jìn)行數(shù)據(jù)庫讀寫開銷不小(使用內(nèi)存數(shù)據(jù)庫可以提高性能,宕機(jī)就會(huì)丟失數(shù)據(jù)??晒┻x擇的內(nèi)存數(shù)據(jù)庫有BerkeleyDB,Mysql的內(nèi)存表);
數(shù)據(jù)庫是一個(gè)單點(diǎn),當(dāng)然可以做數(shù)據(jù)庫的ha來解決這個(gè)問題。
和數(shù)據(jù)庫類似,就算服務(wù)器宕機(jī)了也沒事,session照樣在。使用nfs或windows文件共享都可以,或者專用的共享存儲(chǔ)設(shè)備。
問題:
程序需要定制;
頻繁的進(jìn)行數(shù)據(jù)的序列化和反序列化,性能是否有影響;
共享存儲(chǔ)是一個(gè)單點(diǎn),這個(gè)可以通過raid來解決。
這種方式跟數(shù)據(jù)庫類似,不過因?yàn)槭莾?nèi)存存取的,性能自然要比數(shù)據(jù)庫好多了。
問題:
程序需要定制,增加了工作量;
存入memcached中的數(shù)據(jù)都需要序列化,效率較低;
memcached服務(wù)器一死,所有session全丟。memchached能不能做HA? 我也不知道,網(wǎng)站上沒提。
參考資料:
擴(kuò)展Tomcat 6.x,使用memcached存放session信息
跟memcached類似,但是數(shù)據(jù)不需要序列化,并且是Find-Grained Changes,性能更好。配置對(duì)原來的應(yīng)用完全透明,原有程序幾乎不用做任何修改。而且terracotta本身支持HA。
問題:terracotta的HA本身進(jìn)行數(shù)據(jù)復(fù)制性能如何?
參考資料:
使用Terracotta和Tomcat建立ACTIVE-PASSIVE模式的集群
附:terracotta介紹
OpenTerracotta is an enterprise-class, open-source, JVM-level clusteringsolution. JVM-level clustering simplifies enterprise Java by enablingapplications to be deployed on multiple JVMs, yet interact with eachother as if they were running on the same JVM. Terracotta extends theJava Memory Model of a single JVM to include a cluster of virtualmachines such that threads on one virtual machine can interact withthreads on another virtual machine as if they were all on the samevirtual machine with an unlimited amount of heap.
聯(lián)系客服