zookeeper系統模型之會話重連,當客戶端和服務端之間的網路連線斷開時,zookeeper客戶端會自動進行反覆的重連,直到最終成功連線上zookeeper集群中的一台機器。在這種情況下,再次連線上服務端的客戶端有可能會處於以下兩種狀態之一。
connected:如果在會話超時時間內重新連線上了zookeeper集群中任意一台機器,那麼被視為成功。expired:如果是在會話超時時間以外重新連線上,那麼服務端其實已經對該會話進行了會話清理操作,因此再次連線上的會話將被視為非法會話。??????? 在zookeeper中,客戶端與服務端之間維持的是乙個長連線,在sessiontimeout時間內,服務端會不斷地檢測該客戶端是否還處於正常連線——服務端會將客戶端的每次操作視為一次有效地心跳檢測來反覆的進行會話啟用。因此,在正常情況下,客戶端會話是一直有效地。然而,當客戶端與服務端之間的連線斷開後,使用者在客戶端可能主要會看到兩類異常:connection_loss(連線斷開)和session_expired(會話過期)。那麼該如何正確處理connection_loss和session_expired呢?
??????? 有時會因為網路閃斷導致客戶端與伺服器斷開連線,或是因為客戶端當前連線的伺服器出現問題導致連線斷開,我們統稱這類問題為「客戶端與伺服器連線斷開」現象,即connection_loss。在這種情況下,zookeeper客戶端會自動從位址列表中重新逐個選取新的位址並嘗試進行重新連線,直到最終成功連線上伺服器。
??????? 舉個例子,假設某應用在使用zookeeper客戶端進行setdata操作的時候,正好出現了connection_loss現象,那麼客戶端會立即接收到事件none-disconnected通知,同時會丟擲異常:org.apache.zookeeper.keeperexception$connectionlos***ception。在這種情況下,我們的應用需要做的事情就是捕獲住connection los***ception,然後等待zookeeper的客戶端自動完成重連。一旦客戶端成功連線上一台zookeeper機器後,那麼客戶端就會收到事件none-syncconnected通知,之後就可以重試剛剛出錯的setdata操作。
??????? session_expired是指會話過期,通常發生在connection_loss期間。客戶端和伺服器連線斷開之後,由於重連期間耗時過長,超過了會話超時時間(sessiontimeout)限制後還沒有成功連線上伺服器,那麼伺服器認為這個會話已經結束了,就會開始進行會話清理。但是另一方面,該客戶端本身不知道會話已經失效,並且其客戶端狀態還是disconnected。之後,如果客戶端重新連線了伺服器,那麼很不幸,伺服器會告訴客戶端該會話已經失效(session_expired)。在這種情況下,使用者就需要例項化乙個zookeeper物件,並且看應用的複雜情況,重新恢復臨時資料。
??????? 會話轉移是指客戶端會話從一台伺服器機器轉移到了另一台伺服器機器上。正如上文中提到,假設客戶端和伺服器s1之間的連線斷開後,如果通過嘗試重連後,成功連線上了新的伺服器s2並且延續了有效會話,那麼就可以說會話從s1轉移到了s2上。
??????? 會話轉移現象其實在zookeeper中一直存在,但是在3.2.0版本之前,會話轉移的概念並沒有被明確地提出來。在3.2.0版本之後,zookeeper明確提出了會話轉移的概念,同時封裝了sessionmovedexception異常。之後,在處理客戶端請求的時候,會首先檢查會話的所有者(owner):如果客戶端請求的會話owner不是當前伺服器的話,那麼就會直接丟擲sessionmovedexception異常。當然,由於客戶端已經和這個伺服器斷開了連線,因此無法收到這個異常的響應。只有多個客戶端使用相同的sessionid/sessionpasswd建立會話時,才會收到這樣的異常。因為一旦有乙個客戶端會話建立成功,那麼zookeeper伺服器就會認為該sessionid對應的那個會話已經發生了轉移,於是等到第二個客戶端連線上伺服器後,就被認為是「會話轉移」的情況了。
ZooKeeper系統模型之SetData請求
zookeeper系統模型之setdata請求,服務端對於setdata請求的處理,大體可以分4大步驟,分別是請求的預處理 事務處理 事務應用和請求響應,如下圖所示。zookeeper對於每乙個客戶端請求,都會檢查是否是 會話建立 請求。然而對於setdata請求,因為此時已經完成了會話建立,因此按...
ZooKeeper系統模型之會話清理
zookeeper系統模型之會話清理。當sessiontracker的會話超時檢查執行緒整理出一些已經過期的會話後,那麼就要開始進行會話清理了。會話清理的步驟大致可以分為以下7步。由於整個會話清理過程需要一段的時間,因此為了保證在此期間不再處理來自該客戶端的新請求,sessiontracker會首先...
ZooKeeper資料模型
zookeeper中可以建立一些節點,每乙個節點都唯一對應著乙個用斜線分割的絕對路徑,可以稱之為節點路徑。並且可以為節點關聯相應的資料。這些節點構成類似於檔案系統的樹形一樣的層次結構。在zookeeper中,沒有使用相對路徑的節點。除了下面幾種情況,任何unicode字元都可以作為節點路徑的一部分 ...