?
ZK其核心原理滿足CP,?實現的是最終一致性, 它只保證順序一致性.
zookeeper 基于 zxid 以及阻塞隊列的方式來實現請求的順序一致性。如果一個client連接到一個最新的 follower 上,那么它 read 讀取到了最新的數據,
然后 client 由于網絡原因重新連接到 zookeeper 節點,而這個時候連接到一個還沒有完成數據同步的 follower 節點,那么這一次讀到的數據不久是舊的數據嗎?
實際上 zookeeper 處理了這種情況,client 會記錄自己已經讀取到的最大的 zxid,如果 client 重連到 server 發現 client 的 zxid 比自己大連接會失敗
?
?
ZK 選舉機制
?
?
?
ZK選舉投票核心邏輯
?
FastLeaderElection通信使用的是ServerSocket, 沒有使用NIO/Netty.因為集群通信的節點畢竟有限.
Watch機制
?
ZooKeeper 的 Watcher 機制,總的來說可以分為三個過程:客戶端注冊 Watcher、服務器處理 Watcher 和客戶端回調 Watcher 客戶端注冊 watcher 有 3 種方式,getData、exists、getChildren;
getData()和exists()返回節點的內容,getChildren()返回子節點列表
?
實現原理
ZooKeeper 允許客戶端向服務端注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,那么就會向指定客戶端發送一個事件通知來實現分布式的通知功能。
ZooKeeper 的 Watcher 機制主要包括客戶端線程、客戶端 WatchManager 和 ZooKeeper 服務器三部分。在具體工作流程上,簡單地講,客戶端在向 ZooKeeper 服務器注冊 Watcher 的同時,會將 Watcher 對象存儲在客戶端的 WatchManager 中。當 ZooKeeper 服務器端觸發 Watcher 事件后,會向客戶端發送通知,客戶端線程從 WatchManager 中取出對應的 Watcher 對象來執行回調邏輯。如清單 9 所示,WatchManager 創建了一個 HashMap,這個 HashMap 被用來存放 Watcher 對象。
?
?注: 以上圖片來自于咕泡mic老師課程.
?