集群間Session共享問題解決方案


兩個基本概念的生命周期

 

session:

當新客戶端發現一個HTTP請求時服務端會創建一個session.並分配一個sessionID作為服務端來客戶端的識別,session對象會保存在服務端.此時session對象處天NEW STATE狀態,如果調用 session.isNew()則返回true.

當服務器處理完后,會將sessionID同reponse 一起傳回客戶端,並將其存到cookie中;

當客戶端再發送請求的時候.會將sessionID連同request一起發送給服務端;

服務端再根據傳過來的sessionID將這次request與保存在服務端的session對象聯系起來.此時的session對象已不是NEWSTATE狀態.

這樣循環多次.直到超時或銷毀.

注:當禁用cookie時也是不能使用session的;

 

cookie:

cookie是在客戶端保存的方案.而session是在服務端保存的方案.

如果cookie不設定時間的話就表視它的生命周期為瀏覽器會話的期間,只要關閉IE,cookie就消失了

這種cookie被稱為會話cookie.其一般不保存在硬盤上.而是保存在內存中.

如果設置了過期時間.那么瀏覽器會把cookie保存到硬盤中,再次打IE時會依然有效.直到它的有效期

超時;

注:存儲在硬盤中的cookie可以在不同IE間共享;

 

 

 

 

 

1.背景

隨着互聯網的日益壯大,網站的pv和uv成線性或者指數倍的增加.單服務器單數據庫早已經不能滿足實際需求。目前大多數大型網站的服務器都采用了分布式服務集群的部署方式,所謂集群,就是讓一組計算機服務器協同工作,解決大並發,大數據量瓶頸問題。但是在服務集群中,session共享往往是一個比較頭疼的問題。因為session是在服務器端保存的,如果用戶跳轉到其他服務器的話,session就會丟失,一般情況下,session不可跨服務器而存在。於是就有了分布式系統的session共享問題。

 

2.Session共享實現方案

Session共享有多種解決方法,常用的有四種:客戶端Cookie保存、服務器間Session同步、使用集群管理Session、把Session持久化到數據庫。下面分別就這四種方案進行介紹和比較。

 

2.1客戶端Cookie保存

介紹說明

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

 

這種解決方法的優點是session信息不用存放在服務器端,大大減輕了服務器的壓力。另一個優點是一個session中的兩次或多次請求可以在一個集群中的多個服務器上完成,可以避免單點故障。目前,淘寶是采用的這種解決方案。

缺點有幾個,一是傳遞cookie時,http信息頭的長度限制使我們只能夠在cookie中存入一部分用戶信息;二是需要額外地做session信息加密的工作;第三,如果采用這種方式,每次訪問網站二級域名時都會在http信息頭中帶有這些以cookie形式存儲的session信息,會占用一定的帶寬;最后,由於這種方式是在客戶端進行信息存儲,用戶完全可以禁用cookie或刪除cookie,不是很可靠。

 
2.2服務器間Session同步
介紹說明
使用主-從服務器的架構,當用戶在主服務器上登錄后,通過腳本或者守護進程的方式,將session信息傳遞到各個從服務器中,這樣,用戶訪問其它的從服務器時,就可以讀到session信息。
缺點:比如速度慢、不穩定等,另外,如果session信息傳遞是主->從單向的,會有一些風險,比如主服務器down了,其它服務器無法獲得session信息
 
2.3 使用集群統一管理Session
介紹說明
提供一個群集保存session共享信息.其他應用統統把自己的session信息存放到session集群服務器組。當應用系統需要session信息的時候直接到session群集服務器上讀取。目前大多都是使用Memcache來對Session進行存儲。
以Memcache來實現Session共享的方式目前比較流行的有兩種實現方案,下面主要對這兩種方案進行介紹。
2.3.1 使用Filter方式
此方式使用過濾器的方式重新對httpRequest 對象進行了包裝,並加入memcached客戶端,此方式的優點是:使用簡單,把過濾器配置進去即可,另外比較靈活,因為它是在客戶端實現的,配置比較靈活,而且服務器無關,你可以在任何支持servlet的容器上部署。
2.3.2 memcached-session-manager(MSM)
memcached-session-manager,俗稱MSM,是一個用於解決分布式tomcat環境下session共享的問題的開源解決方案。它的實現原理為以tomcat插件的方式部署在服務器,修改了servlet容器代碼中的session相關代碼,使其連接memcached,在memcached中創建和更新session。MSM擁有如下特性:
  • 支持Tomcat6、Tomcat7
  • 支持黏性、非黏性Session
  • 無單一故障點
  • 可處理tomcat故障轉移
  • 可處理memcached故障轉移
  • 插件式session序列化
  • 允許異步保存session,以提升響應速度
  • 只有當session有修改時,才會將session寫回memcached
  • JMX管理&監控
MSM(memcached-session-manager) 支持tomcat6 和tomcat7 ,利用 Value(Tomcat 閥)對Request進行跟蹤。Request請求到來時,從memcached加載session,Request請求結束時,將tomcat session更新至memcached,以達到session共享之目的, 支持 sticky  和 non-sticky 模式。
優點:開發者不用考慮session共享的問題了,可以專注於程序開發,像正常使用session那樣使用就完事了。不用顯示編寫代碼,只需要對服務器進行配置即可使用。
缺點:如果你想改變session策略的話,必須重新部署每個服務器的servlet容器。
 
2.4 把Session持久化到數據庫
介紹說明
這種共享session的方式即將session信息存入數據庫中,其它應用可以從數據庫中查出session信息。目前采用這種方案時所使用的數據庫一般為mysql。
利用數據庫共享session的方案有一定的實用性,但也有如下缺點:首先session的並發讀寫在數據庫中完成,對mysql的性能要求比較高;其次,我們需要額外地實現session淘汰邏輯代碼,即定時從數據庫表中更新和刪除session信息,增加了工作量
 
附:這份調研報告主要是從網上的資料綜合整理而成,如有涉及到侵權的地方,請作者及時聯系我,我會第一時間刪除。


免責聲明!

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



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