Zookeeper的數據保存在內存中。Zookeeper容許分佈式進程經過共享的層次結構命名空間進行相互協調,層次結構命名空間由ZooKeeper中的數據寄存器——Znode組成,Znode相似於文件和目錄。node
每一個ZNode由兩部分組成:linux
node模型,父node會有多個子node服務器
節點建立後就一直存在,直到有刪除操做來主動清除這個節點,不會隨會話失效而消失。session
節點生命週期和客戶端會話綁定。客戶端會話失效(是會話失效,不是鏈接斷開)時,節點消失。數據結構
不是一種類型,持久和臨時節點都會有順序節點,每一個Zookeeper的父節點會記錄子節點的建立前後順序,在建立的時候自動給子節點的節點名加上一個數字後綴。數字範圍是整型最大值。架構
針對每一個節點的增刪改操做,Zookeeper能夠根據watcher事件進行監控,當監控的某個znode發生變化,就會觸發watch事件。Zookeeper的watch都是一次性的,觸發後當即銷燬。併發
其實就是session工做原理。負載均衡
leader分佈式
follower性能
observer
要保證leader選舉快,就要保證follower節點可控且儘可能少
Zookeeper經過ZAB協議保證數據最終一致性。
Paxos:https://www.douban.com/note/208430424/(寫得好,就懶得再總結了,直接看)
Zookeeper經過ZAB(Zookeeper Atomic Broadcast 原子廣播)這個支持崩潰恢復的一致性協議來維護數據一致性。經過這個協議,Zookeeper實現了一種主從模式的架構來保證各個副本之間的數據一致。
ZAB協議主要包括兩點:
一旦Leader節點沒法工做,ZAB會自動從Follower節點從新選舉出一個Leader
好處是保證提交過的數據不會丟失。由於提交過的數據都是半數經過的,即便leader服務器宕機也至少有一半以上的服務器保存有數據。
follower/observer節點收到後處理寫請求,再回復leader節點
##### 消息廣播和崩潰恢復 * 消息廣播 過半服務器和Leader服務器完成數據狀態同步後,就進入消息廣播模式。當一臺遵循ZAB協議的服務器加入集羣,當發現有Leader服務器後,就自動進入數據恢復模式,和Leader服務器進行數據同步,同步完成後再參與到消息廣播去 Leader服務器接收到客戶端的事務請求,會生成對應事務方案,發起一次消息廣播。當從服務器接收到客戶端事務請求,會將請求轉發給Leader服務器 * 崩潰恢復 當Leader服務器出現異常狀況,則進入恢復模式,從新選舉Leader服務器,當過半機器和Leader服務器完成數據狀態同步以後,就退出恢復模式。服務器在成爲Leader後,先判斷自身未Commit的消息(是否存在於大多數服務器中從而決定是否要將其Commit * 小結 * 因爲使用主從複製模式,全部寫操做都由Leader主導,而讀操做可經過任意節點完成,所以Zookeeper讀性能好於寫性能,適合讀多寫少的場景; * 雖然使用主從,同一時間只有一個Leader,但Failover機制保證了集羣不存在單點失敗(SPOF)的問題; * ZAB協議保證了Failover(崩潰恢復)過程當中的數據一致性; * 服務器收到數據後先寫本地文件再進行處理,保證了數據的持久性
每一個Zookeeper服務器的惟一標識。
事務ID,用於標識一次更新操做的 Proposal ID。爲了保證proposal順序行,zxid必須單調遞增。
Zookeeper使用一個64位數來表示,高32位是leader的epoch,從1開始,每次選出新的Leader,epoch加一。低32位位該epoch內的序號,每次epoch變化,都將低32位的序號重置。保證了zxid的全局遞增性。
LOOKING、FOLLOWING、LEADING、OBSERVING
選票數據結構
投票流程
Zookeeper規定全部有效的投票都必須在同一輪次中。每一個服務器在開始新一輪投票是,會先對本身維護的logicClock進行自增
廣播投票前服務器會現將本身的投票箱清空
每一個服務器最開始都是經過廣播把票投給本身
服務器會嘗試從其餘服務器獲取投票,並計入本身的投票箱。
判斷選舉輪次
選票PK
若是已經肯定有過半服務器承認了本身的投票(也多是更新後的投票),則終止投票,不然繼續接受其餘服務器的投票
更新服務器狀態爲LEADING或者FOLLOWING
Zookeeper實現分佈式鎖原理就是Watch機制+臨時順序節點。
4-1 主動輪詢,心跳?弊端:延遲,壓力
4-2 watch: 解決延遲問題。 弊端:壓力
4-3 多個watch同時觸發,負載壓力?順序節點,watch前一個(按序列順序依次watch前一個),最小的得到鎖!成本:一旦最小的釋放了鎖,Zookeeper只給第二個發事件回調,資源消耗壓力小
Zookeeper寫性能不高,若是有上萬個客戶端參與鎖競爭,就會有上萬個寫請求(建立leader節點)發送給Zookeeper,Zookeeper集羣負載壓力過大;
當釋放鎖,leader主動放棄領導權時,又會觸發watch,須要給每一個客戶端進行通知,負載壓力過大