session共享方案

2021-08-10 05:13:34 字數 2220 閱讀 1362

session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊。session資訊預設是以檔案的形式儲存在服務端的。當程式需要為某個客戶端的請求建立乙個 session 的時候,伺服器首先檢查這個客戶端的請求(http request)裡是否已包含了乙個 session 標識-稱為 sessionid,如果已包含乙個 sessionid 則說明以前已經為此客戶端建立過 session,伺服器就按照 sessionid 把這個 session 檢索出來使用,如果客戶端請求不包含 sessionid,則為此客戶端建立乙個 session 並且生成乙個與此 session 相關聯的 sessionid,sessionid的值應該是乙個既不會重複,又不容易被找到規律以仿造的字串,這個 sessionid 將被在本次響應中返回給客戶端儲存。而這個 sessionid 就是作為客戶端的唯一標識而存在的(即使在同一臺電腦上,瀏覽器 a 和瀏覽器 b 對於伺服器來說都是不同的客戶端)。

而會話保持機制的意義就在於,確保將來自相同客戶端的請求,**至後端相同的伺服器進行處理。換句話說,就是將客戶端與伺服器之間建立的多個連線,都傳送到相同的伺服器進行處理。如果在客戶端和伺服器之間部署了負載均衡裝置,很有可能,這多個連線會被**至不同的伺服器進行處理。如果伺服器之間沒有會話資訊的同步機制,會導致其他伺服器無法識別使用者身份,造成使用者在和應用系統發生互動時出現異常。

因此在應用 session 時可能會遇到的問題:

session 多伺服器共享的問題,假如有多台 php 伺服器進行負載均衡的時候,使用者登入時訪問的是第一台伺服器,沒準下乙個頁面訪問的是第二台伺服器,但是 session 資料是儲存在第一台伺服器上的,因此在訪問下乙個頁面的時候由於沒有 session 資料(第二台伺服器上)導致使用者必須重新登陸。

從前面的分析我們也知道,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

可以將 session 資料儲存在 memcached,redis 之類記憶體資料庫中,memcached 是基於記憶體儲存資料的,效能很高,使用者併發量很大的時候尤其合適。

Session 共享方案

一 什麼是分布式系統?分布式系統 旨在支援應用程式和服務的開發,可以利用物理架構由多個自治的處理元素組成,不共享記憶體,通過網路傳送訊息合作。分布式系統的三個特點 多節點,訊息通訊,不共享記憶體。二 什麼是session?廣義的session 指會話控制。由於http協議是無狀態的,對於不同http...

session共享解決方案

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

解決session共享問方案

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