談?wù)勀銓?duì)Kafka副本Leader選舉原理的理解?
一位7年工作經(jīng)驗(yàn)的小伙伴,面試被問到這樣一道題,說:”談?wù)勀銓?duì)Kafka副本Leader選舉原理的理解“。當(dāng)時(shí),他想,這Kafka用的不就是Zookeeper 的選舉嗎?難道Kafka又自己搞了一套。沒錯(cuò),這回Kafka自己造了一個(gè)輪子。
那么今天,我給大家來聊一聊我對(duì)Kafka副本Leader選舉原理的理解。
1、選舉原理
確實(shí)Kafka早期的版本就是直接用Zookeeper來完成選舉的。利用了Zookeeper的Watch機(jī)制;節(jié)點(diǎn)不允許重復(fù)寫入以及臨時(shí)節(jié)點(diǎn)這些特性。這樣實(shí)現(xiàn)比較簡單,省事。但是也會(huì)存在一定的弊端。比如分區(qū)和副本數(shù)量過多,所有的副本都直接參與選舉的話,一旦某個(gè)出現(xiàn)節(jié)點(diǎn)的增減,就會(huì)造成大量的Watch事件被觸發(fā),ZooKeeper的就會(huì)負(fù)載過重,不堪重負(fù)。
新版本的Kafka中換了一種實(shí)現(xiàn)方式。不是所有的Repalica都參與Leader選舉,而是由其中的一個(gè)Broker統(tǒng)一來指揮,這個(gè)Broker的角色就叫做Controller控制器。
Kafka要先從所有Broker中選出唯一的一個(gè)Controller。
所有的Broker會(huì)嘗試在Zookeeper中創(chuàng)建臨時(shí)節(jié)點(diǎn)/controller,誰先創(chuàng)建成功,誰就是Controller。那如果Controller掛掉或者網(wǎng)絡(luò)出現(xiàn)問題,ZooKeeper上的臨時(shí)節(jié)點(diǎn)就會(huì)消失。其他的Broker通過Watch監(jiān)聽到Controller下線的消息后,繼續(xù)按照先到先得的原則競選Controller。這個(gè)Controller就相當(dāng)于選舉委員會(huì)的主席。
當(dāng)一個(gè)節(jié)點(diǎn)成為Controller之后,他就會(huì)承擔(dān)以下職責(zé):
監(jiān)聽Broker變化、監(jiān)聽Topic變化、監(jiān)聽Partition變化、獲取和管理Broker、Topic、Partition的信息、管理Partiontion的主從信息。
2、選舉規(guī)則
Controller確定以后,就可以開始做分區(qū)選主的事情。接下來就是找候選人。顯然,每個(gè)Replica都想推薦自己,但不是所有的Replica都有競選資格。只有在ISR(In-Sync Replicas)保持心跳同步的副本才有資格參與競選。就好比是皇帝每天著急皇子們開早會(huì),只有每天來打卡的皇子才能加入ISR。那些請(qǐng)假的、遲到的沒有資格參與選舉。
接下來,就是Leader選舉,就相當(dāng)于要在眾多皇子中選出太子。在分布式選舉中,有非常多的選舉協(xié)議比如ZAB、Raft等等,他們的思想歸納起來都是:先到先得,少數(shù)服從多數(shù)。但是Kafka沒有用這些方法,而是用了一種自己實(shí)現(xiàn)的算法。
提到Kafka官方的解釋是,它的選舉算法和微軟的PacificA算法最相近。大致意思就是,默認(rèn)是讓ISR中第一個(gè)Replica變成Leader。比如ISR是1、5、9,優(yōu)先讓1成為Leader。這個(gè)跟中國古代皇帝傳位是一樣的,優(yōu)先傳給皇長子。
假設(shè),我們創(chuàng)建一個(gè)4個(gè)分區(qū)2個(gè)副本的Topic,它的Leader分布是這樣的,如圖所示:
第1個(gè)分區(qū)的副本Leader,落在B節(jié)點(diǎn)上。第2個(gè)分區(qū)的副本Leader落在C節(jié)點(diǎn)上,第3個(gè)分區(qū)的副本Leader落在A節(jié)點(diǎn)上,第4個(gè)分區(qū)的副本Leader落在B節(jié)點(diǎn)上。如果有更多副本,就以此類推。我們發(fā)現(xiàn)Leader的選舉的規(guī)則相當(dāng)于蛇形走位。
這樣設(shè)計(jì)的好處是可以提高數(shù)據(jù)副本的容災(zāi)能力。將Leader和副本完全錯(cuò)開,從而不至于一掛全掛。
以上就是我對(duì)Kafka副本Leader選舉原理的理解!