Session 共享方案

2021-08-22 03:14:01 字數 2624 閱讀 5807

一、什麼是分布式系統?

分布式系統:旨在支援應用程式和服務的開發,可以利用物理架構由多個自治的處理元素組成,不共享記憶體,通過網路傳送訊息合作。
分布式系統的三個特點:

多節點,訊息通訊,不共享記憶體。

二、 什麼是session?

廣義的session:指會話控制。由於http協議是無狀態的,對於不同http請求是沒有上下文關係的,因此常見的場景就是,當使用者登陸乙個系統時候要有合適的方式記錄使用者的登陸資訊和狀態以便在後續操作中繼續使用。
三、分布式session問題a. session 多伺服器共享的問題,假如有多台 php 伺服器進行負載均衡的時候,使用者登入時訪問的是第一台伺服器,沒準下乙個頁面訪問的是第二台伺服器,但是 session 資料是儲存在第一台伺服器上的,因此在訪問下乙個頁面的時候由於沒有 session 資料(第二台伺服器上)導致使用者必須重新登陸。

b. 從前面的分析我們也知道,php 中 session 預設通過檔案的方式實現,但是如果訪問量大,可能產生的 session 檔案會比較多,從眾多的檔案中選擇其中乙個檔案不是一件輕鬆的事情,而且每次都以開啟檔案、讀取檔案的方式,也會產生大量的 i/o操作,嚴重影響伺服器的效能。

四、 分布式session如何共享

1. 通過複製或同步的方式使得 a、b、c 伺服器上都具有相同的 session 資料。

這種方式的弊端是,速度慢。複製資料會出現延遲。

複製資料要消耗很多網路頻寬的。在實際中業界用得比較少。機器的數量越多,複製資料的效能損耗越大。不具備高度擴充套件性。

2. 把原來儲存在伺服器磁碟上的session資料儲存到客戶端的cookie中去。

這樣子,就不需要涉及到資料共享了。當客戶端請求的時候,原來生成在伺服器的資料生成到瀏覽器的 cookie 中,根據 cookie 中的資料識別使用者。php 由原來的」從本地(也就是伺服器)磁碟上讀取 session 資料」轉變為」瀏覽器的 cookie 中讀取資料」。

好處是伺服器的壓力減小了,因為session資料不存在伺服器磁碟上。根本就不會出現 session 讀取不到的問題。

帶來的弊端是:1. 網路請求占用很多。每次請求時,客戶端都要通過 cookie 傳送 session 資料給伺服器。2. 瀏覽器對 cookie 的大小存在限制。3. cookie的安全問題。

3. 分發請求

用一種演算法,什麼機制下 session 是儲存在哪台伺服器下,那麼讀取的時候就按照這種規則去讀取,就能定位到原來的伺服器。

例如 nginx 的 ip_hash, 每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問乙個後端伺服器。

這種方式的弊端是:如果這台機子掛掉了,那麼後續的請求按照 session 的規則還是會分發到這台伺服器上去,但是現在不可用了,就會導致歸屬到這台伺服器上的所有使用者登入失敗。

4. 資料庫存放session

儲存在資料庫中,這種方式的擴充套件性很強,可以隨意增加web而不受影響。放在資料庫裡面安全方面好。

弊端是:放在資料庫裡面,訪問量小沒有問題。大流量**這麼做,只會拖慢速度。因為得查詢資料庫,造成資料庫壓力大。

5. 使用檔案系統存放session

通過檔案系統(比如nfs方式,檔案共享)來實現各台伺服器間的session共享,各台伺服器只需要mount共享伺服器的儲存session的磁碟即可,實現較為簡單。但nfs 對高併發讀寫的效能並不高,在硬碟i/o效能和網路頻寬上存在較大瓶頸,尤其是對於session這樣的小檔案的頻繁讀寫操作。 適合併發量不大的**。

6. 利用快取儲存session

每個使用者進來,系統都會去redis搭建的session伺服器查詢使用者資訊進行後續操作,我們只需要在登陸時候儲存key,登出的時候讓key失效即可。這樣無論是水平拓展或者是垂直拓展就都不影響session的使用了。

具體方案:

為了解決集群環境下的seesion共享問題,共有4種解決方案:

1.粘性session

粘性session是指ngnix每次都將同一使用者的所有請求**至同一臺伺服器上,即將使用者與伺服器繫結。

2.伺服器session複製

即每次session發生變化時,建立或者修改,就廣播給所有集群中的伺服器,使所有的伺服器上的session相同。

3.session共享

快取session,使用redis, memcached。

4.session持久化

將session儲存至資料庫中,像運算元據一樣才做session。

其實,最簡單的兩種方案,就是方案一和方案三,都不需要對session進行任何操作,只需要將nginx和tomcat上的配置檔案修改一下即可。由於我們做集群,訪問量一定是比較大的了,對於第一種方案,如果某台伺服器發生故障,此伺服器上的所有使用者的session都會丟失,所以今天我們採用第三種解決方案。

session共享方案

session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊。session資訊預設是以檔案的形式儲存在服務端的。當程式需要為某個客戶端的請求建立乙個 session 的時候,伺服器首先檢查這個客戶端的請求 http request 裡是否已包含了乙個 session 標識 ...

session共享解決方案

做負載均衡和伺服器集群時,往往會遇到session同步的問題,下面是蒐羅的幾種可行的解決方案,僅供參考。下面是三種不同的解決方案,如果哪位大神有更好的方案,請分享給我,小弟感激不盡 一 專門建乙個資料庫來存session或者單獨建乙個表 每次從資料庫取session,但是如果做了mysql集群,每個...

解決session共享問方案

解決session共享問方案 優點 不需要額外開發,只需要搭建tomcat集群即可。缺點 tomcat 是全域性session複製,集群內每個tomcat的session完全同步 也就是任何時候都完全一樣的 在大規模應用的時候,使用者過多,集群內tomcat數量過多,session的全域性複製會導致...