分佈式SESSION一致性

分佈式SESSION一致性

SESSION是服務器爲客戶端創建的一個會話,存儲用戶的相關信息,用以標識用戶身份等。在單服務器環境下是不需要考慮會話的一致性的問題的,但是在集羣環境下就會出現一些問題,假如一個用戶在登錄請求時負載均衡到了A服務器,A服務器爲其分配了SESSION,下次請求數據時被分配到了B服務器,此時由於B服務器不存在此用戶的SESSION,此用戶會被重定向到登錄頁面,這種情況是不合理的業務邏輯,所以需要維護SESSION的一致性。

解決方案

SESSION 同步

多個服務器之間互相同步SESSION,即A服務器生成一個SESSION信息後同步傳輸到BCD等服務器,同樣BCD服務器生成SESSION信息後也需要同步到A,這樣每個服務器之間都包含全部的SESSION

優點

  • 大部分應用服務器都提供了SESSION複製的功能來實現集羣

缺點

  • SESSION需要網絡傳輸進行同步,其會佔用帶寬,並且存在一定的延遲
  • 一旦某臺機器的SESSION信息有所變化,必須同步更新所有服務器SESSION內容
  • 每個服務器都會存儲全部的用戶信息,性能隨着服務器增加急劇下降,而且容易引起廣播風暴

SESSION 映射

通過將負載均衡服務器進行修改,通過對返回給用戶的SESSION ID或者用戶請求的IP地址進行標記,也就是使用第四層傳輸層中讀取網絡層的IP或者是在第七層中讀取HTTP協議中某些屬性來做HASH,保證對於此用戶的請求全部落到同一臺服務器上

優點

  • 實現相對簡單
  • 只要分配服務器時均勻,則多臺服務器是負載均衡的

缺點

  • 一旦某臺服務器宕機,則會影響落在此服務器請求上的全部用戶
  • 負載均衡服務器變爲了一個有狀態的節點,內存消耗會更大,容災更麻煩

客戶端存儲

將數據直接存儲到客戶端比如Cookie或請求頭中,每次請求客戶端自動攜帶數據信息

優點

  • 簡單,高效
  • 服務端不需要儲存標記用戶信息

缺點

  • 安全性較差,對於敏感信息必須加密
  • 每次請求可能攜帶大量數據,佔用外網帶寬
  • 數據存儲在客戶端就會存在泄密、篡改、竊取等隱患

後端集中存儲

SESSION存儲在一臺單獨的服務器中的數據庫中,例如MysqlOracleSqlServerRedisMongodb等等,各SERVER服務器需要用戶信息時攜帶SESSION ID對於集中存儲服務器進行請求,進而獲取用戶信息

優點

  • 沒有安全隱患
  • 可以方便的水平拓展
  • SERVER服務器重啓不會造成SESSION丟失

缺點

  • 每次請求都增加了一次對於存儲服務器的網絡請求
  • 會對集中存儲服務器存在大量請求,數據庫壓力比較大

參考

https://www.jianshu.com/p/5caed857dc3e
https://www.cnblogs.com/study-everyday/p/7853145.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章