1. 程式人生 > >分散式叢集下的session同步問題

分散式叢集下的session同步問題

一、概述

        傳統的應用伺服器,自身實現的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,應用的最為廣泛,無論是效率還是擴充套件性都很好。