1. 程式人生 > >zookeeper選取過程

zookeeper選取過程

zk的選取過程分析

  1.  zk節點的型別
  • Leader 
  • follower
  • observer
   2. zk選舉

     zk在分散式系統的環境下,各節點啟動時會通過paxos演算法選舉產生leader節點。選舉leader的標準是當有超過一半的節點選舉某個節點時,該節點即被選為leader節點。

    選舉過程如下:    

        1) 節點啟動時,會向所有的節點包括自己傳送Vote資訊,包括選舉的leader,zxid等資訊,剛開始啟動時會選舉自己。

       2) 當節點接收到叢集中其它幾點發過來的選舉資訊時,會採用如下演算法判斷是否需要重新發送選舉資訊。

        條件:

/*
 * We return true if one of the following three cases hold:
 * 1- New epoch is higher
 * 2- New epoch is the same as current epoch, but new zxid is higher
 * 3- New epoch is the same as current epoch, new zxid is the same
 *  as current zxid, but server id is higher.
 */     
return ((newEpoch > curEpoch) || 
        ((newEpoch == curEpoch) &&
        ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));

      3)如果2)條件成立,則節點更新發送的選舉資訊為新收到的選舉資訊,並重新發送。如下所示:

if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch,
                                proposedLeader, proposedZxid, proposedEpoch)) {
                            updateProposal(n.leader, n.zxid, n.peerEpoch); //更新選舉訊息資訊
                            sendNotifications();  //重新發送選舉訊息
                        }

     4)將選舉訊息放到選舉的接收集合中。

recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));  //以傳送選舉訊息的節點的sid為key,一個節點只能接收來自另外一個節點一個選舉Vote

    5)遍歷選舉的接收集合判斷是否有一半的節點選舉自己為leader,如果是,選舉過程結束。

termPredicate(recvset, new Vote(proposedLeader, proposedZxid,
                                        logicalclock.get(), proposedEpoch))

    下圖為兩個節點情況下的選舉。


  三個節點情況下的選舉如下所示: