在集群中session安全和同步是個(gè)最大的問(wèn)題,下面是我收集到的幾種session同步的方案,希望能通過(guò)分析其各自的優(yōu)劣找出其適應的場(chǎng)景。
這是我以前采用的方式,簡(jiǎn)單,高效。比較好的方法是自己采用cookie機制來(lái)實(shí)現一個(gè)session,在應用中使用此session實(shí)現。
問(wèn)題:session中數據不能太多,最好只有個(gè)用戶(hù)id。
參考實(shí)現:http://rollerweblogger.org/
可能大部分應用服務(wù)器都提供了session復制的功能來(lái)實(shí)現集群,tomcat,jboss,was都提供了這樣的功能。
問(wèn)題:
性能隨著(zhù)服務(wù)器增加急劇下降,而且容易引起廣播風(fēng)暴;
session數據需要序列化,影響性能。
如何序列化,可以參考 對象的序列化和反序列化.
參考資料:
使用數據庫來(lái)保存session,就算服務(wù)器宕機了也沒(méi)事,session照樣在。
問(wèn)題:
程序需要定制;
每次請求都進(jìn)行數據庫讀寫(xiě)開(kāi)銷(xiāo)不小(使用內存數據庫可以提高性能,宕機就會(huì )丟失數據??晒┻x擇的內存數據庫有BerkeleyDB,Mysql的內存表);
數據庫是一個(gè)單點(diǎn),當然可以做數據庫的ha來(lái)解決這個(gè)問(wèn)題。
和數據庫類(lèi)似,就算服務(wù)器宕機了也沒(méi)事,session照樣在。使用nfs或windows文件共享都可以,或者專(zhuān)用的共享存儲設備。
問(wèn)題:
程序需要定制;
頻繁的進(jìn)行數據的序列化和反序列化,性能是否有影響;
共享存儲是一個(gè)單點(diǎn),這個(gè)可以通過(guò)raid來(lái)解決。
這種方式跟數據庫類(lèi)似,不過(guò)因為是內存存取的,性能自然要比數據庫好多了。
問(wèn)題:
程序需要定制,增加了工作量;
存入memcached中的數據都需要序列化,效率較低;
memcached服務(wù)器一死,所有session全丟。memchached能不能做HA? 我也不知道,網(wǎng)站上沒(méi)提。
參考資料:
擴展Tomcat 6.x,使用memcached存放session信息
跟memcached類(lèi)似,但是數據不需要序列化,并且是Find-Grained Changes,性能更好。配置對原來(lái)的應用完全透明,原有程序幾乎不用做任何修改。而且terracotta本身支持HA。
問(wèn)題:terracotta的HA本身進(jìn)行數據復制性能如何?
參考資料:
使用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)系客服