分佈式SESSION一致性

分佈式SESSION一致性

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

解決方案

SESSION 同步

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

優勢

  • 大部分應用服務器都提供了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
相關文章
相關標籤/搜索