web集羣時session共享

1、爲何要共享session?php

  (1)首先要想知道爲何要session共享,必須先了解一下session原理,這樣有助於我更好的瞭解session的共享,html

  默認狀況下,php的session文件是保存在磁盤文件中。在php.ini配置文件中的配置項以下:java

  session.save_handler = filesmysql

  session.save_path = "N;/path"web

  第一個配置項是指定使用files(文件形式)存儲session數據。redis

  第二個參數指定保存的路徑。N表示生成多少級目錄(不放到一個目錄下,分散到多個磁盤目錄中去)sql

  session原理詳解連接 http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html數據庫

  (2)個人理解是單一後端服務器是不存在session共享問題的。由於session數據保存在一臺服務器上。可是作了web集羣后,由於經過負載均衡,同一個IP訪問同一個頁面會被分配到不一樣的服務器上,後端

   若是session不一樣步的話,一個登陸用戶,一會是登陸狀態,瀏覽器

  一會又不是登陸狀態。這樣子登陸保存的session數據就須要進行共享了。

    下圖來自互聯網:

    

2、session共享的方法

 (1)session保存在數據庫

    我理解本質是:本身寫程序(php,java均可以實現,反正是保存在數據庫中)模擬實現session的機制。

    具體爲,把之前存儲在文件中的session數據存儲到數據庫中去,那麼這樣作,其實就不用到php內置的session機制了(像session_start()之類的函數都不須要去用了)。寫程序要模擬的是,從數據庫拿session數據,約定什麼狀況下數據過時了而後自動清理,

    這裏是指刪除數據庫中的行。保存在文件中的時候,php有垃圾回收機制會去自動清理過時的session文件。

 

    多服務器session同步的兩種方法:

    1,用一個低端電腦建個數據庫專門存放web服務器的session,或者,把這個專門的數據庫建在文件服務器上,用戶訪問web服務器時,會去這個專門的數據庫check一下session的狀況,以達到session同步的目的。

    2,這種方法是把存放session的表和其餘數據庫表放在一塊兒,若是MySQL也作了集羣了話,每一個mysql節點都要有這張表,而且這張session表的數據表要實時同步。

    優勢:擴展性很強,能夠隨意增長WEB而不受影響。放在數據庫裏面安全方面好。

    缺點:用數據庫來同步session,訪問量小沒有問題,若是大流量網站的話會加大數據庫的壓力,由於全部對session的操做都要進行數據庫的操做。數據庫原本就是容易產生瓶頸的地方,

    若是把session還放到數據庫裏面,無疑是雪上加霜。高併發訪問的狀況下,會出現很大的性能問題。

  (2)session數據存儲到客戶端的cookie中

    這樣子,就不須要涉及到數據共享了。a客戶端請求的時候,原來生成在服務器的數據生成到瀏覽器的cookie中,根據cookie中的數據識別用戶。

    php由原來的」從本地(也就是服務器)磁盤上讀取session數據」轉變爲」瀏覽器的cookie中讀取數據」,這樣子,

    在多臺php服務器負載均衡的狀況下,即使第一秒請求是a服務器,第二秒請求是b服務器,都不須要管哪臺服務器了。反正都是讀取客戶端上的cookie數據。

    通常是把session數據按照本身定義的加密規則,加密後後存在cookie中。

    優勢:服務器的壓力減少了,由於session數據不存在服務器磁盤上。根本就不會出現session讀取不到的問題。

    缺點:網絡請求佔用不少。每次請求時,客戶端都要經過cookie發送session數據給服務器;另外,瀏覽器對cookie的大小存在限制。每一個瀏覽器限制是不一樣的。

      第二方面是安全問題:把session數據放到客戶端,通常session中存的都是重要性數據(賬號、暱稱、用戶id等),會存在安全問題。

  (3)用Nosql數據庫Redis或者memcache同步session,基於內存存儲數據的性能很高,用戶併發量很大的時候尤爲合適

    主要是利用內存的數據讀取速度是很快的,與磁盤讀取的速度不是一個數量級的。

    使用內存存儲:方便統計在線人數,內存的速度比磁盤訪問快、內存數據庫系統可以控制內存中的過時數據自動失效(恰好符合session過時須要)。

    Redis或memcache能夠作分佈式,若是沒有這功能,他也不能用來作session同步。他能夠把web服務器中的內存組合起來,成爲一個"內存池",不論是哪一個服務器產生的sessoin均可以放到這個"內存池"中,其餘的均可以使用。

    優勢:以這種方式來同步session,不會加大數據庫的負擔,而且安全性比用cookie大大的提升,把session放到內存裏面,比從文件中讀取要快不少。

    缺點:redis或memcache把內存分紅不少種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能徹底利用內存,會產生內存碎片,若是存儲塊不足,還會產生內存溢出。

    ==========================我是知識的搬運工======================== 

相關文章
相關標籤/搜索