分佈式SESSION一致性
SESSION
是服務器爲客戶端創建的一個會話,存儲用戶的相關信息,用以標識用戶身份等。在單服務器環境下是不需要考慮會話的一致性的問題的,但是在集羣環境下就會出現一些問題,假如一個用戶在登錄請求時負載均衡到了A
服務器,A
服務器爲其分配了SESSION
,下次請求數據時被分配到了B
服務器,此時由於B
服務器不存在此用戶的SESSION
,此用戶會被重定向到登錄頁面,這種情況是不合理的業務邏輯,所以需要維護SESSION
的一致性。
解決方案
SESSION 同步
多個服務器之間互相同步SESSION
,即A
服務器生成一個SESSION
信息後同步傳輸到B
、C
、D
等服務器,同樣B
、C
、D
服務器生成SESSION
信息後也需要同步到A
,這樣每個服務器之間都包含全部的SESSION
優點
- 大部分應用服務器都提供了
SESSION
複製的功能來實現集羣
缺點
SESSION
需要網絡傳輸進行同步,其會佔用帶寬,並且存在一定的延遲- 一旦某臺機器的
SESSION
信息有所變化,必須同步更新所有服務器SESSION
內容 - 每個服務器都會存儲全部的用戶信息,性能隨着服務器增加急劇下降,而且容易引起廣播風暴
SESSION 映射
通過將負載均衡服務器進行修改,通過對返回給用戶的SESSION ID
或者用戶請求的IP
地址進行標記,也就是使用第四層傳輸層中讀取網絡層的IP
或者是在第七層中讀取HTTP
協議中某些屬性來做HASH
,保證對於此用戶的請求全部落到同一臺服務器上
優點
- 實現相對簡單
- 只要分配服務器時均勻,則多臺服務器是負載均衡的
缺點
- 一旦某臺服務器宕機,則會影響落在此服務器請求上的全部用戶
- 負載均衡服務器變爲了一個有狀態的節點,內存消耗會更大,容災更麻煩
客戶端存儲
將數據直接存儲到客戶端比如Cookie
或請求頭中,每次請求客戶端自動攜帶數據信息
優點
- 簡單,高效
- 服務端不需要儲存標記用戶信息
缺點
- 安全性較差,對於敏感信息必須加密
- 每次請求可能攜帶大量數據,佔用外網帶寬
- 數據存儲在客戶端就會存在泄密、篡改、竊取等隱患
後端集中存儲
將SESSION
存儲在一臺單獨的服務器中的數據庫中,例如Mysql
、Oracle
、SqlServer
、Redis
、Mongodb
等等,各SERVER
服務器需要用戶信息時攜帶SESSION ID
對於集中存儲服務器進行請求,進而獲取用戶信息
優點
- 沒有安全隱患
- 可以方便的水平拓展
SERVER
服務器重啓不會造成SESSION
丟失
缺點
- 每次請求都增加了一次對於存儲服務器的網絡請求
- 會對集中存儲服務器存在大量請求,數據庫壓力比較大
參考
https://www.jianshu.com/p/5caed857dc3e
https://www.cnblogs.com/study-everyday/p/7853145.html