集羣中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