首先我們來分析這個問題,問題裡出現了兩個關鍵詞:叢集、Session,在回答問題之前我們先來聊聊這兩個關鍵詞。
說到叢集首先給人的第一感覺是一大堆的伺服器,其實這種想法是片面的,叢集是指多臺伺服器上部署同一個業務,通俗說就是同一件事多個人來幹。談到叢集就不得不說分散式。分散式是為了解決業務的高耦合性產生,將一個寵大的任務拆分成多個子任務部署在不同伺服器上,這就是分散式。
由於HTTP協議是無狀態的,瀏覽器的每一次訪問對於伺服器來說都是第一次訪問,伺服器就好像得了阿茲海默症(健忘症)。為了解決這個問題,Cookie和Session兩兄弟應運而生。
使用者訪問Web伺服器後,伺服器生成了Session並將唯一識別符號(SessionID)存放在客戶端Cookie中,下次瀏覽器發出請求就會攜帶Cookie,伺服器根據Cookie中的SessionID就去找對應的Session,找到了則代表會話成功。
因為Session預設是儲存在伺服器端的,而叢集部署時使用者的請求可能會被定向至不同的節點伺服器上,所以可能第一次訪問時儲存了會話狀態,第二次訪問又被定向到其它節點(其它節點上並沒有此使用者的Session資訊)上導致會話狀態丟失!
解決這個問題,我們只要確保所有節點伺服器共用Session即可,方案有以下幾種供大家選擇:
1、粘性Session
同一個使用者的請求分配到同一臺伺服器(透過一致性HASH演算法實現),這樣始終在這臺伺服器上尋找Session,稱為粘性Session。
2、Session複製
將所有節點伺服器上的Session保持同步複製狀態,任何一臺節點上產生新的Session都複製到其它節點伺服器。
3、Session共享
將Session放在統一的地方集中管理(如:Session入庫、存入Redis等),然後所有節點伺服器統統從這個地方存取Session即可。
以上這幾種解決方案應用最廣的就是Session共享機制,既可解決Session同步問題又無需擔心資料丟失。
首先我們來分析這個問題,問題裡出現了兩個關鍵詞:叢集、Session,在回答問題之前我們先來聊聊這兩個關鍵詞。
叢集說到叢集首先給人的第一感覺是一大堆的伺服器,其實這種想法是片面的,叢集是指多臺伺服器上部署同一個業務,通俗說就是同一件事多個人來幹。談到叢集就不得不說分散式。分散式是為了解決業務的高耦合性產生,將一個寵大的任務拆分成多個子任務部署在不同伺服器上,這就是分散式。
Session由於HTTP協議是無狀態的,瀏覽器的每一次訪問對於伺服器來說都是第一次訪問,伺服器就好像得了阿茲海默症(健忘症)。為了解決這個問題,Cookie和Session兩兄弟應運而生。
使用者訪問Web伺服器後,伺服器生成了Session並將唯一識別符號(SessionID)存放在客戶端Cookie中,下次瀏覽器發出請求就會攜帶Cookie,伺服器根據Cookie中的SessionID就去找對應的Session,找到了則代表會話成功。
叢集部署時Session會出什麼問題?因為Session預設是儲存在伺服器端的,而叢集部署時使用者的請求可能會被定向至不同的節點伺服器上,所以可能第一次訪問時儲存了會話狀態,第二次訪問又被定向到其它節點(其它節點上並沒有此使用者的Session資訊)上導致會話狀態丟失!
如何解決叢集環境下的Session同步問題?解決這個問題,我們只要確保所有節點伺服器共用Session即可,方案有以下幾種供大家選擇:
1、粘性Session
同一個使用者的請求分配到同一臺伺服器(透過一致性HASH演算法實現),這樣始終在這臺伺服器上尋找Session,稱為粘性Session。
2、Session複製
將所有節點伺服器上的Session保持同步複製狀態,任何一臺節點上產生新的Session都複製到其它節點伺服器。
3、Session共享
將Session放在統一的地方集中管理(如:Session入庫、存入Redis等),然後所有節點伺服器統統從這個地方存取Session即可。
以上這幾種解決方案應用最廣的就是Session共享機制,既可解決Session同步問題又無需擔心資料丟失。