Kafka選舉機制原理
? 點擊上方“JavaEdge”,關(guān)注公眾號

1 大數(shù)據(jù)常用的選主機制

Leader選舉算法非常多,大數(shù)據(jù)領(lǐng)域常用的有以下兩種:
1.1 Zab(zookeeper使用)

Zab協(xié)議有四個階段
Leader election
Discovery (E#epoch establish)
Synchronization (5X#sync with followers)
Broadcast
比如3個節(jié)點選舉leader:編號為1、2、3。1先啟動,選擇自己為leader,然后2啟動
首先也選擇自己為leader,由于1,2都沒過半,選擇編號大的為leader,所以1、2都
選擇2為leader,然后3啟動發(fā)現(xiàn)1,2已經(jīng)協(xié)商好且數(shù)量過半,于是3也選擇2為leader,leader選舉結(jié)束。
1.2 Raft

類似美國大選。
在Raft中,任何時候一個服務器可以扮演下面角色之一:
Leader
處理所有客戶端交互,日志復制等,一般只有一個LeaderFollower
類似選民,完全被動
Candidate候選人
可被選為一個新的領(lǐng)導人
啟動時在集群中指定一些機器為Candidate,然后Candidate開始向其他機器(尤
其是Follower)拉票,當某個Candidate的票數(shù)超過半數(shù),它就成為leader。
都是 paoxs 算法的變種。
由于Kafka集群依賴zookeeper集群,所以最簡單最直觀的方案是,所有Follower
都在ZooKeeper上設置一個Watch,一旦Leader宕機,其對應的ephemeral
znode會自動刪除,此時所有Follower都嘗試創(chuàng)建該節(jié)點,而創(chuàng)建成功者
(ZooKeeper保證只有一個能創(chuàng)建成功)即是新的Leader,其它Replica即為
Follower。
2 常用選主機制的缺點
2.1 split-brain (腦裂)

這是由ZooKeeper的特性引起的,雖然ZooKeeper能保證所有Watch按順序觸發(fā),但是網(wǎng)絡延遲,并不能保證同一時刻所有Replica“看”到的狀態(tài)是一樣的,這就可能造成不同Replica的響應不一致,可能選出多個領(lǐng)導“大腦”,導致“腦裂”。
2.2 herd effect (羊群效應)

如果宕機的那個Broker上的Partition比較多, 會造成多個Watch被觸發(fā),造成集群內(nèi)大量的調(diào)整,導致大量網(wǎng)絡阻塞。
2.3 ZooKeeper負載過重

每個Replica都要為此在ZooKeeper上注冊一個Watch,當集群規(guī)模增加到幾千個Partition時ZooKeeper負載會過重。

3 Kafka Partition選主機制

3.1 優(yōu)勢

Kafka的Leader Election方案解決了上述問題,它在所有broker中選出一個controller,所有Partition的Leader選舉都由controller決定。
controller會將Leader的改變直接通過RPC的方式(比ZooKeeper Queue的方式更高效)通知需為此作為響應的Broker。
沒有使用 zk,所以無 2.3 問題;也沒有注冊 watch無 2.2 問題
leader 失敗了,就通過 controller 繼續(xù)重新選舉即可,所以克服所有問題。
3.2 Kafka集群controller的選舉

每個Broker都會在Controller Path (/controller)上注冊一個Watch。當前
Controller失敗時,對應的Controller Path會自動消失(因為它是ephemeral
Node),此時該Watch被fire,所有“活” 著的Broker都會去競選成為新的
Controller (創(chuàng)建新的Controller Path),但是只會有一個競選成功(這點由
Zookeeper保證)。競選成功者即為新的Leader,競選失敗者則重新在新的
Controller Path上注冊Watch。因為Zookeeper的Watch是一次性的, 被fire一次
之后即失效,所以需要重新注冊。
3.3 Kafka partition leader的選舉

由controller執(zhí)行:
從Zookeeper中讀取當前分區(qū)的所有ISR(in-sync replicas)集合
調(diào)用配置的分區(qū)選擇算法選擇分區(qū)的leader

上面五種分區(qū)算法都是選擇PreferredReplica作為當前Partition的leader。區(qū)別僅
僅是選擇leader之后的操作有所不同。
所以,對于下圖partition 0先選擇broker2,之后選擇broker 0作カleader;對于
partition 1先選擇broker 0,之后迭拝broker 1作カleader;partition 2先選擇
broker1,之后選擇 broker2作為leader。
往期推薦

目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群
喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~
