zookeeper選取過程
阿新 • • 發佈:2019-01-23
zk的選取過程分析
- zk節點的型別
- Leader
- follower
- observer
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))
下圖為兩個節點情況下的選舉。
三個節點情況下的選舉如下所示: