伴隨網站業務規模和訪問量的逐步發展,本來由單臺服務器、單個域名的迷你網站架構已經沒法知足發展須要。前端
此時咱們可能會購買更多服務器,而且啓用多個二級子域名以頻道化的方式,根據業務功能將網站分佈部署在獨立的服務器上;或經過負載均衡技術(如:DNS輪詢、Radware、F五、LVS等)讓多個頻道共享一組服務器。算法
OK,頭腦中咱們已經構思了這樣的解決方案,不過進入深刻開發後新的技術問題又隨之而來:sql
咱們把網站程序分佈部署到多臺服務器上,並且獨立爲幾個二級域名,因爲Session受實現原理的侷限(PHP中Session默認以文件的形式保存在本地服務器的硬盤),使得咱們的網站用戶不得不常常在幾個頻道間來回輸入用戶名、密碼登入,致使用戶體驗大打折扣;另外,本來程序能夠直接從用戶Session變量中讀取的資料(如:暱稱、積分、登入時間等),由於沒法跨服務器同步更新Session 變量,迫使開發人員必須實時讀寫數據庫,從而增長了數據庫的負擔。數據庫
因而,解決網站跨服務器之間的Session共享方案需求變得迫切起來,最終催生了多種解決方案,下面列舉4種較爲可行的方案進行對比探討:瀏覽器
1. 基於NFS的Session共享緩存
NFS是Net FileSystem的簡稱,最先由Sun公司爲解決Unix網絡主機間的目錄共享而研發。安全
這個方案實現最爲簡單,無需作過多的二次開發,僅需將共享目錄服務器mount到各頻道服務器的本地session目錄便可,缺點是NFS依託於複雜的安全機制和文件系統,所以併發效率不高,尤爲對於session這類高併發讀寫的小文件,會因爲共享目錄服務器的io-wait太高,最終拖累前端WEB應用程序的執行效率。服務器
2. 基於數據庫的Session共享網絡
首選固然是大名鼎鼎的MySQL數據庫,而且建議使用內存表Heap,提升session操做的讀寫效率。這個方案的實用性比較強,相信你們廣泛在使用,它的缺點在於session的併發讀寫能力取決於Mysql數據庫的性能,同時須要本身實現session淘汰邏輯,以便定時從數據表中更新、刪除 session記錄,當併發太高時容易出現表鎖,雖然咱們能夠選擇行級鎖的表引擎,但不得不否定使用數據庫存儲Session仍是有些殺雞用牛刀的架勢。session
3. 基於Cookie的Session共享
這個方案咱們可能比較陌生,但它在大型網站中仍是比較廣泛被使用。原理是將全站用戶的Session信息加密、序列化後以Cookie的方式,統一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的全部二級域名站點時,會傳遞與之域名對應的全部Cookie內容的特性,從而實現用戶的Cookie化Session 在多服務間的共享訪問。
這個方案的優勢無需額外的服務器資源;缺點是因爲受http協議頭信心長度的限制,僅可以存儲小部分的用戶信息,同時Cookie化的 Session內容須要進行安全加解密(如:採用DES、RSA等進行明文加解密;再由MD五、SHA-1等算法進行防僞認證),另外它也會佔用必定的帶寬資源,由於瀏覽器會在請求當前域名下任何資源時將本地Cookie附加在http頭中傳遞到服務器。
4. 基於緩存(Memcache)的Session共享
Memcache因爲是一款基於Libevent多路異步I/O技術的內存共享系統,簡單的Key + Value數據存儲模式使得代碼邏輯小巧高效,所以在併發處理能力上佔據了絕對優點,目前本人所經歷的項目達到2000/秒 平均查詢,而且服務器CPU消耗依然不到10%。
另外值得一提的是Memcache的內存hash表所特有的Expires數據過時淘汰機制,正好和Session的過時機制不謀而合,下降了過時Session數據刪除的代碼複雜度,對比「基於數據庫的存儲方案」,僅這塊邏輯就給數據表產生巨大的查詢壓力。