PHP做負載平衡回話保持問題參考

來源:互聯網
上載者:User

標籤:c   java   tar   a   檔案   資料   

最近一個項目的伺服器老是出現Session資料丟失問題,導致使用者莫名其妙的退出,原因是太相信我們的營運人員所謂的負載平衡會話保持的概念。會話保持 的原理就是負載平衡通過Cookie來分發那個客戶串連被路由到那台後端具體伺服器,例如後端有兩台伺服器,負載平衡將會將所有的請求平均分配對應後端兩 台伺服器的cookie標識,後面的請求都會路由到具體的某台伺服器上。但絕對不是萬能的,我們就是因為太相信這個,才導致問題持續了很久沒有發現具體的 原因。至於為什麼不能保持會話,我到現在還沒有想明白,也沒有具體追問我們的運營人員。等有時間具體研究,這裡只是提醒大家不要假設負載平衡會為你穩定地 保持會話,因為此類問題在使用者量越大的時候越容易出現,出現的機率達到1%-2%,這對大規模的即時性項目是不能容忍的,例如線上集體考試。

那 麼在上述問題的前提下,很多朋友首先想到的是Cluster,特別是搞JavaEE開發的人,但記憶體複製型的Cluster配置還是比較複雜的,效率不一 定能達到我們想象的效果,其Session的恢複機制還是牽涉到儲存的問題。在PHP環境下大多數人直接預設採用PHP的檔案Session儲存策略,我 跟蹤了一下PHP的Session建立機制,一下子讓人毛色洞開,PHP在接收到一個使用者請求時,首先從請求的Cookie裡面拿Session ID,只要拿到,不管三七二十一,就認定這個Session ID了,即使當前沒有發現具體的Session存在,它也會為你建立一個對應該Session ID的會話。不像很多JavaEE應用伺服器,只要沒有Session,才不管你用戶端傳過來什麼,它都獨立會建立一個。PHP就Session處理這一 點,我們就可以做容錯形式的叢集了,最簡單的方法就是讓後端的多台伺服器共用同一個Session儲存區。就這麼簡單,簡單的簡直讓人不可思議。

那很多人擔心的是是否會發生Session隱藏檔讀取鎖定、等衝突呢?我的回答是,不會,如果會的話,單台機器也會。

文 件儲存Session最大問題是每次一個請求發生,並且調用了session_start(),都會開啟一次該檔案,並且讀取其中的內容到記憶體,當然向Session寫也是這樣,所以很多對吞吐能力要求高的PHP配置中可能會採用Memcache等記憶體機制,但可以肯定地說,我們也可以像共用硬碟一樣共 享Memcache,其核心的痛點應該是如何讓Memcache像一個共用儲存一樣。

一頭霧水的問題終於解決了,我們解決這個問題最痛苦的是日誌機制不完整,跨部門多,導致發現問題周折,但總算解決了,分享出來供大家參考,不要走我們的老路。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.