一、概述
傳統的應用伺服器,自身實作的session管理是大多是基于單機的,對于大型分布式網站來說,支撐其業務的遠遠不止一台伺服器,而是一個分布式叢集,請求在不同的伺服器之間跳轉。那麼,如何保持伺服器之間的session同步呢?
分布式環境下,如果一次請求被負載均衡配置設定到了伺服器A,如果按照一般的方式存儲session,在A的本地會存儲session,如果此次會話沒有結束,下一次的請求被負載均衡到了B伺服器(或者其他的非A伺服器)那麼上次的請求的session資訊将不再存在。如果不做任何處理的話,使用者将出現頻繁登入的現象。是以分布式環境下session的存儲顯得格外重要。
二、分布式session存儲方法
1、持久化
将session的存儲放在資料庫中,進行持久化,每台伺服器要使用session的時候,可以同時向資料庫中去存取,這樣可以保證當伺服器當機的時候,可以保持資料不容易丢失。
但是缺點也很明顯,整個系統的吞吐量下降。
2、粘性session
原理:粘性session 是指将一個請求綁定到固定的伺服器上,正如上面所說,如果設定了粘性session,負載均衡将請求轉發到了伺服器A上,此使用者以後的每一次請求都會轉發到伺服器A上,相當于使用者和伺服器黏在一起了。
優點:實作很簡單,可以用Nginx的ip_hash機制配置,不需要對session做處理。
缺點:不是高可用的,如果目前通路的當機了,請求會轉發到其他的伺服器,目前請求的session資訊将會失效。适合用在故障對使用者的的影響較小的場景下。
3、session複制
原理:任何一個伺服器上的session發生變化,該節點會把這個 session的所有内容序列化,然後廣播給所有其它節點,不管其他伺服器需不需要session,以此來保證Session同步。
優點:可容錯,各個伺服器之間session能夠實時響應;
缺點:網絡負荷會有一定的壓力(可能會堵塞,拖慢伺服器)。
4、session緩存機制
使用緩存伺服器儲存session,不管是memcache還是redis要以叢集的方式來提供session服務。并且memcache和redis的快速通路具有很大的優勢,可以提供較高的讀寫性能,這一點對并發量大的系統來說很重要。從安全性來考慮,session時候過期時間的,利用緩存存儲可以利用緩存的失效機制。
5、用戶端存儲
服務端存儲所有使用者的session,記憶體占用較大,可以将session存儲到浏覽器cookie中。
缺點:資料存儲在用戶端上,并在網絡傳輸,存在洩漏、篡改、竊取等安全隐患。session存儲的資料大小受cookie限制。這種方式不建議使用。
6、SpringSession實作
具體實作原理後續補充說明。
三、總結
本文中提到的分布式session的6種處理政策,其中就應用廣泛性而言,第四種方式,也就是基于第三方緩存架構共享session,應用的最為廣泛,無論是效率還是擴充性都很好。