如何實現session跨服務器共享


如何實現session跨服務器共享

Session共享有多種解決方法,常用的有四種:客戶端Cookie保存、服務器間Session同步、使用集群管理Session、把Session持久化到數據庫。

1.客戶端Cookie保存

   以cookie加密的方式保存在客戶端,每次session信息被寫在客戶端,然后經瀏覽器再次提交到服務器,即使兩次請求在集群中的兩台服務器上完成,也可以到達session共享。

   優點是減輕服務器端的壓力;

   缺點是受到cookie的大小限制,可能占用一定帶寬,因為每次請求會在頭部附帶一定大小的cookie信息,另外這種方式在用戶禁止使用cookie的情況下無效。

   傳統網站一般通過將一部分數據存儲在cookie中,來規避分布式環境下session的操作。這樣做的弊端很多,一方面cookie的安全性一直廣為垢病,另一方面cookie存儲數據的大小是有限制的。隨着移動互聯網的發展,很多情況下還得兼顧移動端的session需求,使得采用cookie來進行session同步的方式的弊端更為凸顯,分布式session正是在這種情況下應運而生的。

2.服務器間Session同步

    定時同步各個服務器的session信息,此方法可能有一定延時,用戶體驗也不是很好。

    使用主-從服務器的架構,當用戶在主服務器上登錄后,通過腳本或者守護進程的方式,將session信息傳遞到各個從服務器中,也可以手工把session文件存放的目錄改為nfs網絡文件系統,從而實現文件的跨機器共享(使用nfs或windows文件共享都可以,或者專用的共享存儲設備)。

    這樣,用戶訪問其它的從服務器時,就可以讀到session信息。

    缺點:比如速度慢、不穩定等,另外,如果session信息傳遞是主->從單向的,會有一些風險,比如主服務器down了,其它服務器無法獲得session信息。

3.把Session持久化到數據庫

   這種共享session的方式即將session信息存入數據庫中,其它應用可以從數據庫中查出session信息。目前采用這種方案時所使用的數據庫一般為mysql。

   利用數據庫共享session的方案有一定的實用性,但也有如下缺點:

   首先session的並發讀寫在數據庫中完成,對mysql的性能要求比較高;

   其次,我們需要額外地實現session淘汰邏輯代碼,即定時從數據庫表中更新和刪除session信息,增加了工作量。

    對於系統可靠性要求較高的用戶,可以將session持久化到DB中,這樣可以保證宕機時會話不易丟失,但缺點也是顯而易見的,系統的整體吞吐將受到很大的影響。

4.使用集群管理Session

    將session統一存儲在緩存集群上,如memcache,這樣可以保證較高的讀、寫性能,這一點對於並發量大的系統來說非常重要;並且從安全性考慮,session畢竟是有有效期的,使用緩存存儲,也便於利用緩存的失效機制。

    使用緩存的缺點是,一旦緩存重啟,里面保存的會話也就丟失了,需要用戶重新建立會話,可以使用緩存集群來保證緩存的穩定性。

 如圖(基於緩存的分布式session架構)所示,前端用戶請求經過隨機分發之后,可能會命中后端任意的Web Server,將session以sessionid作為key,保存到后端的緩存集群中,使得不管請求如何分配,即便是某個Web Server宕機,也不會影響其他Web Server獲得 session,這樣既實現了集群間的session同步,又提高了 Web Server的容錯性。

   Tomcat作為Web Server時,可以通過一個簡單的工具memcached-session- manager9(一個Tomcat session共享解決方案), 實現基於memcache的分布式session。

轉載自:如何實現session跨服務器共享 - 張三的哥哥 - 博客園 (cnblogs.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM