集群間如何實現session共享


  原文地址:https://www.woozee.com.cn/article/27.html

       根據session-cookie機制,session是保存在每台服務器的,但在集群中,擁有多台服務器,每台各自為政,勢必會造成在這台服務器中登錄,獲取session成功,但是到另一台服務器上,又會獲取不到session,造成鑒權失敗,這樣對用戶來說是極不友好的,那么怎么解決這個問題呢?

  有以下幾種處理方式: 

  • 找一塊公共的空間用來儲存session,而不是將session儲存在集群節點的某台服務器上,此時,每一台服務器都能訪問這塊空間,從而實現session共享;
  • 仍在每台服務器上保存session信息,不作修改,但采用另一種同步機制,實時同步每一台服務器的session信息;
  • 構建一種全新的鑒權機制,不采用session-cookie機制,但要去除此鑒權機制對單個服務器的依賴。

  綜上所述,列舉幾種的具體實現方案:

  1、持久化session到數據庫,即使用數據庫來儲存session。數據庫正好是我們普遍使用的公共儲存空間,一舉兩得,推薦使用mysql數據庫,輕量並且性能良好。

    優點:就地取材,符合大多數人的思維,使用簡單,不需要太多額外編碼工作 

    缺點:對mysql性能要求較高,訪問mysql需要從連接池中獲取連接,又因為大部分請求均需要進行登錄鑒權,所以操作數據庫非常頻繁,當用戶量達到一定程度之后,極易造成數據庫瓶頸,不適用於處理高並發的情況。

  2、使用redis共享session。redis是一個key-value的儲存系統。可以簡單的將其理解為一個數據庫,與傳統數據庫的區別是,它將數據儲存於內存中,並自帶有內存到硬盤的序列化策略,即按策略將內存中的數據同步到磁盤,避免數據丟失,是目前比較流行的解決方案。

    優點:無需增加數據庫的壓力,因為數據存儲於內存中,所以讀取非常快,高性能,並能處理多種類型的數據。

    缺點:額外增加一些編碼,以便操作redis。

  3、使用memcache同步session,memcache可以實現分布式,可將服務器中的內存組合起來,形成一個“內存池”,以此充當公共空間,保存session信息。

    優點:數據儲存在內存中,讀取非常快,性能好; 

    缺點:memcache把內存分成很多種規格的存儲塊,有大有小,不能完全利用內存,會產生內存碎片,浪費資源,如果儲存塊不足,還會產生內存溢出。

  4、通過腳本或守護進程在多台服務器之間同步session

    優點:實現了session共享; 

    缺點:對個人來說實現較為復雜,速度不穩定,有延時性,取決於現實中服務運行狀態,偶然性較大,如果用於訪問過快,可能出現session還沒同步成功的情況。

  5、使用NFS共享session。NFS是Network File Server共享服務器的簡稱,最早由Sun公司為解決Unix網絡主機間的目錄共享而研發。選擇一台公共的NFS做共享服務器,儲存所有session數據,每台服務器所需的session均從此處獲取。

    優點:較好的實現了session共享; 

    缺點:成本較高,對於個人來說難以實現。NFS依托於復雜的安全機制和文件系統,因此並發效率不高。

  6、使用Cookie共享session。此方案可以說是獨辟蹊徑了,將分布式思想用到了極致。如上文分析所說,session-cookie機制中,session與cookie相互關聯,以cookie做中轉站,用來找到對應的session,其中session存放在服務器。那么如果將session中的內容存放在cookie中呢,那么則省略了服務器保存session的過程,后台只需要根據cookie中約定的標識進行鑒權校驗即可。

    優點:完美的貫徹分布式的理念,將每個用戶都利用起來,無需耗費額外的服務器資源; 

    缺點:受http協議頭長度限制,cookie中存儲的信息不宜過多;為了保持cookie全局有效,所以其一般依賴在根域名下,所以基本上所有的http請求都需要傳遞cookie中的這些標記信息,所以會占用一些服務器的帶寬;鑒權信息全存儲於cookie中,cookie存在於客戶端,服務器並沒有儲存相關信息,cookie存在着泄露的可能,或則其他人揣摩出規則后可以進行偽裝,其安全性比其他方案差,故需要對cookie中信息進行加密解密,來增強其安全性。


免責聲明!

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



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