分布式集群系統下的高可用session解決方案


目前,為了使web能適應大規模的訪問,需要實現應用的集群部署. 而實現集群部署首先要解決session的統一,即需要實現session的共享機制。

 目前,在集群系統下實現session統一的有如下幾種方案:

  • (1) 應用服務器間的session復制共享(如tomcat session共享)
  • (2) 基於cache DB緩存的session共享

應用服務器間的session復制共享

    session復制共享,主要是指集群環境下,多台應用服務器之間同步session,使session保持一致,對外透明。 如果其中一台服務器發生故障,根據負載均衡的原理,web服務器(apache/nginx)會遍歷尋找可用節點,分發請求,由於session已同步,故能保證用戶的session信息不會丟失。

 

此方案的不足之處:

  • 技術復雜,必須在同一種中間件之間完成(如:tomcat-tomcat之間).
  • session復制帶來的性能損失會快速增加.特別是當session中保存了較大的對象,而且對象變化較快時, 性能下降更加顯著. 這種特性使得web應用的水平擴展受到了限制。
  • Session內容序列化(serialize),會消耗系統性能。
  • Session內容通過廣播同步給成員,會造成網絡流量瓶頸,即便是內網瓶頸。  

 基於cache DB緩存的session共享

即使用cacheDB存取session信息,應用服務器接受新請求將session信息保存在cache DB中,當應用服務器發生故障時,web服務器(apache/nginx)會遍歷尋找可用節點,分發請求,當應用服務器發現session不在本機內存時,則去cache DB中查找,如果找到則復制到本機,這樣實現session共享和高可用。

目前有開源的msm用於解決tomcat之間的session共享:Memcached_Session_Manager(MSM)

http://code.google.com/p/memcached-session-manager/
一個高可用的Tomcat session共享解決方案,除了可以從本機內存快速讀取Session信息(僅針對黏性Session)外,同時可使用memcached存取Session,以實現高可用。

特性

  • 支持Tomcat6、Tomcat7支持黏性、非黏性Session
  • 無單一故障點
  • 可處理tomcat故障轉移
  • 可處理memcached故障轉移
  • 插件式session序列化
  • 允許異步保存session,以提升響應速度
  • 只有當session有修改時,才會將session寫回memcached
  • JMX管理&監控

該方案的不足之處:

  • memcache支持的數據結構比較單一
  • memcache的內存必須足夠大,否則會出現用戶session從Cache中被清除
  • 需要定期的刷新緩存
  • 服務器故障時,存在於內存的memcache數據將會丟失

 為了解決基於memcache中存在的不足,故提出了下面的一種解決方案:

基於redis緩存的session共享

 結合上面的 MSM 思想,由 redis負責 session 數據的存儲,而我們自己實現的 session manager 將負責 session 生命周期的管理。

一般的系統架構:

圖1

    此架構存在着當redis master故障時, 雖然可以有一到多個備用slave,但是redis不會主動的進行master切換,這時session服務中斷。

    為了做到redis的高可用,引入了haproxy或者keepalived來解決redis master slave的切換問題。即:

圖2

 

 此體系結構中, redis master出現故障時, 通過haproxy設置redis slave為臨時master, redis master重新恢復后, 再切換回去. 此方案中, redis-master 與redis-slave 是雙向同步的, 解決目前redis單點問題. 這樣保證了session信息在redis中的高可用。

 

實現此方案:

nginx        1   192.168.1.102

tomcat1    1  

tomcat2    1

redis-master   1 

redis-slave      1

slave1     1

slave2     1

haproxy vip  1

 

 

實現分布式session最大的挑戰莫過於如何實現session在分布式系統之間的共享。在分布式環境下,每個子系統都是跨網絡的獨立JVM,在這些JVM之間實現共享數據的方式無非就是TCP/IP通訊。無論是memcached,還是其它,底層都是基於TCP/IP的。所以,我認為使用何種工具實現分布式session都是可行的,沒有那種實現優於另外一種實現,在不同的應用場景,各有優缺點。
世間萬物,無十全十美,不要盲目的崇拜某種技術,唯有適合才是真理。


免責聲明!

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



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