多台服務器共享session問題


在現在的大型網站中,如何實現多台服務器中的session數據共享呢

    當使用多台服務器架設成集群之后,我們通過負載均衡的方式,同一個用戶(或者ip)訪問時被分配到不同的服務器上,假設在A服務器登錄,如果在B服務器拿不到用戶的登錄信息session。這時訪問到B服務器時就出現未登錄情況。

    所以如何對於這種情況做到共享session至關重要。

   以下給出一些解決方案:(來源網絡以及自己的一些見解)

  1.通過數據庫mysql共享session

     a.采用一台專門的mysql服務器來存儲所有的session信息。

      用戶訪問隨機的web服務器時,會去這個專門的數據庫服務器check一下session的情況,以達到session同步的目的。 

      缺點就是:依懶性太強,mysql服務器無法工作,影響整個系統;

    b.將存放session的數據表與業務的數據表放在同一個庫。如果mysql做了主從,需要每一個庫都需要存在這個表,並且需要數據實時同步。

    缺點:用數據庫來同步session,會加大數據庫的負擔,數據庫本來就是容易產生瓶頸的地方,如果把session還放到數據庫里面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正數據庫的負擔 。但是session一般的查詢頻率較高,放在數據庫中查詢性能也不是很好,不推薦使用這種方式。

2.通過cookie共享session

   把用戶訪問頁面產生的session放到cookie里面,就是以cookie為中轉站。

   當訪問服務器A時,登錄成功之后將產生的session信息存放在cookie中;當訪問請求分配到服務器B時,服務器B先判斷服務器有沒有這個session,如果沒有,在去看看客戶端的cookie里面有沒有這個session,如果cookie里面有,就把cookie里面的sessoin同步到web服務器B,這樣就可以實現session的同步了。 

   缺點:cookie的安全性不高,容易偽造、客戶端禁止使用cookie等都可能造成無法共享session。

3.通過服務器之間的數據同步session

  使用一台作為用戶的登錄服務器,當用戶登錄成功之后,會將session寫到當前服務器上,我們通過腳本或者守護進程將session同步到其他服務器上,這時當用戶跳轉到其他服務器,session一致,也就不用再次登錄。

  缺陷:速度慢,同步session有延遲性,可能導致跳轉服務器之后,session未同步。而且單向同步時,登錄服務器宕機,整個系統都不能正常運行。

4.通過NFS共享Session

  選擇一台公共的NFS服務器(Network File Server)做共享服務器,所有的Web服務器登陸的時候把session數據寫到這台服務器上,那么所有的session數據其實都是保存在這台NFS服務器上的,不論用戶訪問那太Web服務器,都要來這台服務器獲取session數據,那么就能夠實現共享session數據了。

  缺點:依賴性太強,如果NFS服務器down掉了,那么大家都無法工作了,當然,可以考慮多台NFS服務器同步的形式。

5.通過memcache同步session

  memcache可以做分布式,如果沒有這功能,他也不能用來做session同步。他可以把web服務器中的內存組合起來,成為一個"內存池",不管是哪個服務器產生的sessoin都可以放到這個"內存池"中,其他的都可以使用。 

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

  缺點:memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。 

6.通過redis共享session

  redis與memcache一樣,都是將數據放在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

   根據實際開發應用,一般選擇使用memcache或redis方式來共享session.


免責聲明!

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



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