天天看點

中間件随筆2-ZooKeeper概述

   分布式環境下的操作,比如說2PC,但是這種方式代價高,生産上這種解決方案也少;

   描述下需求(抄的):提出的Vote才被標明、隻有一個Vote呗標明、某個Vote標明,所有參與者都能獲得這個資訊。

   paxos協定,那個從paxos到zook,看看那些證明 腦袋疼;不過redis的sentinel選舉,看起來蠻清楚。條件1,你不提還能選?條件2:要有一個統一的規則,比如sentinel選舉就是先到先得,zook選舉是zxid-myid的比較,個體内不會出現多個成功者的情況;半數以上同意才算標明,保證多個參與者也不會出現多個成功者的情況。條件3:zook裡準leader會發送newepoch,來通知并确認自己的上司地位。

  書上說zook的zab是paxos的應用,呵呵,zab保證的是分布式下主從複制的一緻性、順序性,不說了,來張圖:   

中間件随筆2-ZooKeeper概述

  再來張狀态轉換圖:

中間件随筆2-ZooKeeper概述

  狀态轉換在QuorumPeer這個類裡,那個選舉可以參照LeaderElection的實作,具體算法是:

  選舉:同leader周期epoch,資料最新zxid的,或myid最大的當選,半數以上産生準leader,準leader發送newepoch,半數ack結束選舉;

  同步:主資料最新,其他diff差異;舊主恢複,zxid已增長,全量同步;舊主恢複,zxid未增長,truc以前資料。

  廣播:leader接受follower請求,發送proposal,半數同意則commit,注意follower按照zxid順序執行。

  那個,zookeeper的核心就是zab協定,至于資料結構參照ZKDatabase、DataTree、PathTrie、DataNode,追加日志、記憶體快照參照FileTxnSnapLog、FileSnap,Leader、Follower、Observer,以及相關的RequestProcessor調用鍊,資料不少,源碼debug起來也還好。

  再來張圖,湊湊版面

中間件随筆2-ZooKeeper概述

繼續閱讀