題目來(lái)源
網(wǎng)上沖浪:還不懂分布系統(tǒng),速看深度剖析Kafka Controller選舉過(guò)程
在查找關(guān)于Kafka單機(jī)分區(qū)的上限以及分區(qū)多了會(huì)有怎樣的問(wèn)題的時(shí)候,發(fā)現(xiàn)了這個(gè)比較有趣的問(wèn)題,就記錄了下來(lái)。
一般所有的分布式系統(tǒng),都會(huì)涉及到這個(gè)問(wèn)題:腦裂、以及如何避免腦裂問(wèn)題。
題目描述
- Kafka中Controller的作用是什么?
- Kafka中Controller的選舉流程是什么?
- Kafka腦裂是什么?
- Kafka如何避免腦裂問(wèn)題?
題目答案
-
Kafka中Controller中的作用是什么?
– 管理partition的ISR列表:當(dāng)Follower副本無(wú)法及時(shí)跟隨Leader副本時(shí),Controller會(huì)將其從ISR列表中移除。
– 分區(qū)重平衡:當(dāng)添加或者刪除Broker節(jié)點(diǎn)時(shí),Controller負(fù)責(zé)對(duì)Partition的分布進(jìn)行重平衡,以確保數(shù)據(jù)的均勻分布。
– 當(dāng)集群中有一個(gè)副本的leader掛掉了,controller需要在集群中選舉出一個(gè)新的leader,選舉的規(guī)則是從isr集合中最左邊獲得。
– 當(dāng)集群中新增或者減少broker,controller將該信息同步給其他broker。
– 當(dāng)集群中有分區(qū)新增或者減少,controller將該信息同步給其他broker。
– 存儲(chǔ)集群元數(shù)據(jù)
Controller保存了集群中最全的元數(shù)據(jù)信息,并通過(guò)發(fā)送請(qǐng)求同步到其他Broker上面
– 從我參考文章中的信息來(lái)看,Controller節(jié)點(diǎn)不負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。但是好像之前看bilibili視頻的時(shí)候,Controller節(jié)點(diǎn)又是存儲(chǔ)數(shù)據(jù)的。重新思考之后,Controller可能是一個(gè)子進(jìn)程,由Broker進(jìn)程在競(jìng)選Controller成功后創(chuàng)建,可以跟Broker處于同一個(gè)節(jié)點(diǎn)上面。 -
Kafka集群的Controller選舉過(guò)程是怎樣的?
– 注冊(cè)Controller節(jié)點(diǎn)
Kafka集群剛上線時(shí),每個(gè)Broker啟動(dòng)時(shí)會(huì)向zookeeper嘗試注冊(cè)一個(gè)/controller節(jié)點(diǎn),因?yàn)橥粫r(shí)刻只能存在一個(gè)/controller節(jié)點(diǎn),所以只有一個(gè)Broker可以成功創(chuàng)建節(jié)點(diǎn)并成為Controller,獲得的序號(hào)最小的那個(gè)broker將會(huì)作為集群中的controller。
– 監(jiān)聽Controller節(jié)點(diǎn)
所有非Controller的Broker都會(huì)在Zookeeper中對(duì)/controller路徑設(shè)置一個(gè)Watcher事件,這樣當(dāng)Controller節(jié)點(diǎn)發(fā)生變化時(shí)(例如Controller失效),所有非Controller就會(huì)收到一個(gè)Watcher事件。
– 選舉新的Controller
當(dāng)某個(gè)Broker接收到Controller節(jié)點(diǎn)變化的通知后,它會(huì)再次嘗試在Zookeeper中的/controller路徑下創(chuàng)建臨時(shí)節(jié)點(diǎn)。與Kafka集群剛上線時(shí)的“注冊(cè)Controller節(jié)點(diǎn)”類似,只有一個(gè)Broker能夠成功在Zookeeper中創(chuàng)建/controller臨時(shí)節(jié)點(diǎn),并成為新的Controller。新的Controller會(huì)在選舉成功后接管集群元數(shù)據(jù)的管理工作。
– 更新集群元數(shù)據(jù)
新Controller在選舉成功后,需要更新集群元數(shù)據(jù),包括分區(qū)狀態(tài)、副本狀態(tài)等。同時(shí),新控制器會(huì)通知所有相關(guān)的Broker更新他們的元數(shù)據(jù)信息。這樣,集群中所有的Broker都能夠知道新Controller的身份,并進(jìn)行協(xié)同工作。
– 備注
臨時(shí)節(jié)點(diǎn)的特點(diǎn)是在創(chuàng)建它的客戶端(即Broker節(jié)點(diǎn))斷開連接時(shí),它會(huì)自動(dòng)被Zookeeper節(jié)點(diǎn)刪除。這種機(jī)制保證了只有一個(gè)Broker節(jié)點(diǎn)能夠成為Controller,以避免多個(gè)控制器同時(shí)對(duì)集群元數(shù)據(jù)進(jìn)行操作引發(fā)問(wèn)題。 -
Kafka腦裂是什么?
腦裂問(wèn)題是分布式系統(tǒng)中經(jīng)常出現(xiàn)的現(xiàn)象,Kafka腦裂問(wèn)題是由于網(wǎng)絡(luò)或其他原因(比如Full GC)導(dǎo)致多個(gè)Broker認(rèn)為自己是Controller,從而導(dǎo)致元數(shù)據(jù)不一致和分區(qū)狀態(tài)混亂的問(wèn)題。 -
Kafka腦裂是怎么產(chǎn)生的?Kafka和Zookeeper是如何避免腦裂問(wèn)題?
– 假設(shè)有三個(gè)Broker,a、b、c,其中a是Controller。此時(shí)的epoch number是1(Kafka是通過(guò)epoch number(紀(jì)元編號(hào))解決腦裂問(wèn)題)。
– 現(xiàn)在a因?yàn)閒ull gc時(shí)間過(guò)程,導(dǎo)致與zookeeper的會(huì)話超時(shí)了。zookeeper就會(huì)刪除/controller節(jié)點(diǎn),并通知b和c競(jìng)選Controller節(jié)點(diǎn)。
– b和c 參加競(jìng)選,假設(shè)b成為了新的Controller,將epoch number的值設(shè)置為2。之后b就會(huì)向c同步新的元數(shù)據(jù)信息,通c更新元數(shù)據(jù)信息。
– a結(jié)束Full GC后,繼續(xù)向b和c同步數(shù)據(jù),b和c發(fā)現(xiàn)epoch number小于自己當(dāng)前保存的epoch number的值,就會(huì)拒絕a的管理,并通知a當(dāng)前最新的epoch number是2了,a就會(huì)知道自己已經(jīng)不是Controller了,最后與b重新建立連接,并從b同步最新的元數(shù)據(jù)。這樣就解決了腦裂的問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-856871.html
參考
題目來(lái)源:還不懂分布系統(tǒng),速看深度剖析Kafka Controller選舉過(guò)程文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-856871.html
到了這里,關(guān)于面試題:Kafka中Controller的作用是什么?選舉流程是怎樣的?以及如何避免腦裂問(wèn)題?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!