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