文章出處

四種多服務器共享session的方法,伴隨網站業務規模和訪問量的逐步發展,原本由單臺服務器、單個域名的迷你網站架構已經無法滿足發展需要。

此時我們可能會購買更多服務器,并且啟用多個二級子域名以頻道化的方式,根據業務功能將網站分布部署在獨立的服務器上;或通過負載均衡技術(如:DNS輪詢、Radware、F5、LVS等)讓多個頻道共享一組服務器。

OK,頭腦中我們已經構思了這樣的解決方案,不過進入深入開發后新的技術問題又隨之而來:

我們把網站程序分布部署到多臺服務器上,而且獨立為幾個二級域名,由于Session受實現原理的局限(PHP中Session默認以文件的形式保存在本地服務器的硬盤),使得我們的網站用戶不得不經常在幾個頻道間來回輸入用戶名、密碼登入,導致用戶體驗大打折扣;另外,原本程序可以直接從用戶Session變量中讀取的資料(如:昵稱、積分、登入時間等),因為無法跨服務器同步更新Session變量,迫使開發人員必須實時讀寫數據庫,從而增加了數據庫的負擔。

于是,解決網站跨服務器之間的Session共享方案需求變得迫切起來,最終催生了多種解決方案,下面列舉4種較為可行的方案進行對比探討:錨點

1. 基于NFS的Session共享

NFS是NetFileSystem的簡稱,最早由Sun公司為解決Unix網絡主機間的目錄共享而研發。

這個方案實現最為簡單,無需做過多的二次開發,僅需將共享目錄服務器mount到各頻道服務器的本地session目錄即可,缺點是NFS依托于復雜的安全機制和文件系統,因此并發效率不高,尤其對于session這類高并發讀寫的小文件,會由于共享目錄服務器的io-wait過高,最終拖累前端WEB應用程序的執行效率。錨點

2. 基于數據庫的Session共享

首選當然是大名鼎鼎的MySQL數據庫,并且建議使用內存表Heap,提高session操作的讀寫效率。這個方案的實用性比較強,相信大家普遍在使用,它的缺點在于session的并發讀寫能力取決于Mysql數據庫的性能,同時需要自己實現session淘汰邏輯,以便定時從數據表中更新、刪除 session記錄,當并發過高時容易出現表鎖,雖然我們可以選擇行級鎖的表引擎,但不得不否認使用數據庫存儲Session還是有些殺雞用牛刀的架勢。錨點

3. 基于Cookie的Session共享

這個方案我們可能比較陌生,但它在大型網站中還是比較普遍被使用。原理是將全站用戶的Session信息加密、序列化后以Cookie的方式,統一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的所有二級域名站點時,會傳遞與之域名對應的所有Cookie內容的特性,從而實現用戶的Cookie化Session 在多服務間的共享訪問。

這個方案的優點無需額外的服務器資源;缺點是由于受http協議頭信心長度的限制,僅能夠存儲小部分的用戶信息,同時Cookie化的 Session內容需要進行安全加解密(如:采用DES、RSA等進行明文加解密;再由MD5、SHA-1等算法進行防偽認證),另外它也會占用一定的帶寬資源,因為瀏覽器會在請求當前域名下任何資源時將本地Cookie附加在http頭中傳遞到服務器。錨點

4. 基于Memcache的Session共享

Memcache由于是一款基于Libevent多路異步I/O技術的內存共享系統,簡單的Key+ Value數據存儲模式使得代碼邏輯小巧高效,因此在并發處理能力上占據了絕對優勢,目前本人所經歷的項目達到2000/秒平均查詢,并且服務器CPU消耗依然不到10%。

另外值得一提的是Memcache的內存hash表所特有的Expires數據過期淘汰機制,正好和Session的過期機制不謀而合,降低了過期Session數據刪除的代碼復雜度,對比“基于數據庫的存儲方案”,僅這塊邏輯就給數據表產生巨大的查詢壓力

 

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170214/101301.html

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()