分布式系統session一致性問題


一、引言

1.什么是session

Session 是服務器用來保存用戶操作的一系列會話信息,由Web容器進行管理。最常見的,會把用戶的登錄信息、用戶信息存儲在 session 中,以保持登錄狀態。

2.session的創建

在會話開始時,分配一個唯一的會話標識 SessionID(sessionid 是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個 session,

有一個 sessionId 和它對應。),並通過 Cookie 將這個標識告訴瀏覽器(客戶端會將 sessionID 保存在 cookie 中。),

以后每次請求的時候,瀏覽器都會帶上這個會話標識SessionID來告訴Web服務器這個請求是屬於哪個會話的。

在Web服務器上,各個會話都有獨立的存儲,保存不同會話的信息。如果遇到禁用Cookie的情況,

一般的做法就是把這個會話標識放到URL的參數中。

3.session共享

分布式情況下,如果每台服務器都session存在自己的內存中,不同服務器之間就會造成數據不一致問題,

這時候就需要session共享。單機情況下,不存在Session共享的情況。分布式情況下,

如果不進行Session共享會出現數據不一致,比如:會導致請求落到不同服務器要重復登錄的情況。

二、解決方案

1.session復制

 應用服務器開啟web容器的session復制功能,在集群中的幾台服務器之間同步session對象,

多個web-server之間相互同步session,這樣每個web-server之間都包含全部的session。

不足:

  • session的同步需要數據傳輸,占內網帶寬,有時延

  • 有更多web-server時,容易造成網絡風暴

2. 客戶端存儲

將session存儲到瀏覽器cookie中。每次請求服務器的時候,將session放在請求中發送給服務器,服務器處理完請求后再將修改后的session響應給客戶端。

缺點:

  • 數據存儲在端上,並在網絡傳輸,存在泄漏、篡改、竊取等安全隱患

  • session存儲的數據大小受cookie限制

3. 反向代理hash一致性

反向代理層使用用戶ip來做hash,以保證同一個ip的請求落在同一個web-server上

不足:

  • 如果web-server重啟,一部分session會丟失,產生業務影響,例如部分用戶重新登錄

  • 如果web-server水平擴展,rehash后session重新分布,也會有一部分用戶路由不到正確的session

4. 后端統一集中存儲

將session存儲在web-server后端的存儲層,數據庫或者緩存,一般用redis/memchache緩存。

 


免責聲明!

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



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