事務ID
Znode的創建刪除,更改內容等都是作為zookeeper的事務進行執行的。
對于每一個事務請求,zookeeper都會為其分配一個全局唯一的事務ID,從ID可以識別出事務的全局順序。
節點特性
czxid:create zxid,數據節點創建時的事務ID
mzxid:modified zxid,節點最后更新時的事務ID
ctime:create time
mtime:modified zxid
version :節點版本號
cversion:子節點版本號
aversion:acl版本號
enumChildren:子節點數量
pzxid:子節點修改的最后事務id
版本:表示對數據節點內容,子節點,acl的修改次數
當創建時都為0
每個數據節點都有三個版本:
version:當前數據節點內容的版本號
cversion:當前數據子節點的版本號
aversion:當前節點的acl版本號
版本的作用:充當樂觀鎖的寫入校驗。用CAS的方式。
Watcher:數據變更的通知
當客戶端在zookeeper上注冊后,會在客戶端生成回調函數,當觸發監聽任務時,zookeeper通知客戶端,客戶端執行watchermanager的回調函數。
客戶端的視角創建會話
以下是一次 ZooKeeper 會話創建的詳細過程,以客戶端的視角為主:
-
客戶端啟動: 客戶端應用啟動,并創建一個ZooKeeper客戶端實例。
-
Watcher對象注冊: 客戶端可以注冊Watcher對象,用于在特定事件發生時接收通知。Watcher對象負責處理與會話相關的事件,如連接建立、節點變更等。
-
建立連接: 客戶端調用createSession()操作來連接到ZooKeeper集群。在這個過程中,客戶端選擇一個服務器進行連接。
-
ClientCnxn: 一旦連接建立,將創建一個ClientCnxn對象,代表客戶端與服務器之間的連接。該對象處理底層的TCP連接和數據傳輸。
-
Session ID 和密碼分配:如果是客戶端的第一次連接,或者之前的會話已經過期,服務器會為客戶端分配一個唯一的 Session ID。同時,服務器會生成與該 Session ID 相關聯的會話密碼(Session Password)。
-
SendThread: 客戶端的SendThread負責向服務器發送請求,包括創建Session、讀取、寫入等操作。這個線程處理所有的網絡通信。
-
EventThread: 客戶端的EventThread用于處理從服務器返回的事件(Event)。這包括連接狀態的改變、節點變更等。Watcher對象將在這里收到通知。
-
Watch事件和通知: 如果客戶端注冊了Watcher對象,當與會話相關的事件發生時,服務器將生成相應的事件(Event),并通過EventThread傳遞給客戶端。這樣,客戶端能夠得知會話中的狀態變化。
-
心跳檢測: 會話期間,客戶端和服務器之間定期發送心跳以保持連接的活躍。
-
會話超時處理: 如果客戶端未在規定的會話超時時間內發送心跳,或者由于其他原因導致通信中斷,服務器將終止會話。此時,相關的Watcher對象將收到會話超時的通知。
服務器