找工作黨收集的PHP筆試題目

一.多Web服務器之間共享Session的解決方案

以下內容參考鏈接:http://daihaixiang.blog.163.com/blog/static/38301342011111591140815/

提出問題:爲了滿足足夠大的應用,滿足更多的客戶,於是我們架設了N臺Web服務器(N>=2),在多臺Web服務器的情況下,我們會涉及到一個問題:用戶登陸一臺服務器以後,如果在跨越到另一臺服務器的時候能夠繼續使用客戶的Session?

解決方案:
1. 寫客戶端Cookie的方式
       當用戶登陸成功以後,把網站域名、用戶名、密碼、token、 session有效時間全部採用cookie的形式寫入到客戶端的cookie裏面,如果用戶從一臺Web服務器跨越到另一臺服務器的時候,我們的程序主動去檢測客戶端的cookie信息,進行判斷,然後提供對應的服務,當然,如果cookie過期,或者無效,自然就不讓用戶繼續服務了。當然,這種方法的弊端就不言而喻了,比如客戶端禁用了cookie或者cookie被黑客竊取了呢?這些都可以解決,目前淘寶session框架就是基於client cookie做開發,不見得他們就出了很大的問題?也許是最可行的方式,可以配合memcached來實現。

2. 服務器之間Session數據同步的方式
       假設Web服務器A是所有用戶登陸的服務器,那麼當用戶驗證登陸一下,session數據就會寫到A服務器裏,那麼就可以自己寫腳本或者守護進程來自動把session數據同步到其他Web服務器,那麼當用戶跳轉到其他服務器的時候,那麼session數據是一致的,自然就能夠直接進行服務無須再次登陸了。缺點是,可能會速度慢,不穩定,如果是單向同步的話,登陸服務器出現問題,那麼其他服務器也無法服務,當然也可以考慮雙向同步的問題。這個方案都可以解決,目前zookeeper可以實現。

3. 利用NFS共享Session數據的方式
       其實這個方案和下面的Mysql方案類似,只是存儲方式不一 樣。大致就是有一臺公共的NFS服務器(Network File Server)做共享服務器,所有的Web服務器登陸的時候把session數據寫到這臺服務器上,那麼所有的session數據其實都是保存在這臺 NFS服務器上的,不論用戶訪問哪臺Web服務器,都要來這臺服務器獲取session數據,那麼就能夠實現共享session數據了。缺點是依賴性太強,如果NFS服務器down掉了,那麼大家都無法工作了,當然,可以考慮多臺NFS服務器同步的形式。這個方案都可以解決,目前zookeeper可以實現,當然memcached也可以實現session共享。

4. 利用Mysql數據庫共享Session數據的方式
       這個方式與NFS的方式類似,也是採用一臺Mysql服務器做共享服務器,把所有的session的數據保存到Mysql服務器上,所有Web服務器都來這臺Mysql服務器來獲取Session 數據。缺點也是依賴性太強,Mysql無法工作了影響所有的Web服務器,當然,可以考慮多太Mysql數據庫來共享session,使用同步Mysql 數據的方式。這種方式跟方式3類似,同樣可以採用memcached來做,nosql也可以實現,這些都不是問題。

5. 使用硬件設備
       這個算是比較成熟的解決方案了,使用類似BIG-IP的負載設備來實現資源共享,那麼就能夠又穩定又合理的的共享Session了。目前很多門戶網站採用這種方式。缺點很明顯了,就是要收費了,硬件設備肯定需要購買成本的,不過對於專業或者大型應用來講,是比較合理並且值得的,這種方式可以放到最後面考慮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章