web集群時session共享


一、為什么要共享session?

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

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

  session.save_handler = files

  session.save_path = "N;/path"

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

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

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

  (2)我的理解是單一后端服務器是不存在session共享問題的。因為session數據保存在一台服務器上。但是做了web集群后,因為通過負載均衡,同一個IP訪問同一個頁面會被分配到不同的服務器上,

   如果session不同步的話,一個登錄用戶,一會是登錄狀態,

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

    下圖來自互聯網:

    

二、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不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。

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

  

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM