本篇內(nèi)容介紹了“Kafka中Controller的作用是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為邢臺縣等服務(wù)建站,邢臺縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為邢臺縣企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
Kafka除了狀態(tài)管理以外,還主要有以下功能職責(zé):
更新集群元數(shù)據(jù)信息
創(chuàng)建Topic
刪除Topic
分區(qū)重分配
preferred leader副本選舉
Topic分區(qū)擴展
Broker加入集群
Broker崩潰
受控關(guān)閉
controller leader選舉
Client可以從任何一臺broker上獲取集群完整的元數(shù)據(jù)信息,這就需要controller在集群元數(shù)據(jù)信息發(fā)生變更后通知每一個broker。當(dāng)有分區(qū)信息變更時,controller會將變更后的信息封裝進(jìn)UpdateMetadataRequest請求中,然后發(fā)送給集群中的每個Broker。
Controller啟動時會創(chuàng)建一個Zookeeper監(jiān)聽器,該監(jiān)聽器的作用是監(jiān)聽/brokers/topics下子節(jié)點的變化情況。
Topic在創(chuàng)建時首先會在/brokers/topics節(jié)點下面創(chuàng)建一個子節(jié)點(znode),并且將該Topic的分區(qū)和副本情況寫入這個znode中。當(dāng)監(jiān)聽器發(fā)現(xiàn)/brokers/topics有新增znode時,就會立即觸發(fā)controller創(chuàng)建Topic(為新的Topic每個分區(qū)確定Leader和ISR),然后更新集群元數(shù)據(jù)信息。
當(dāng)創(chuàng)建完成以后,controller會創(chuàng)建一個新的監(jiān)聽器/brokers/topics/{topic_name},監(jiān)聽新的Topic內(nèi)容的變更。這樣當(dāng)Topic分區(qū)發(fā)生變化時,controller能夠及時收到通知。
Kafka集群刪除Topic都是向Zookeeper下的/admin/deletetopics下新增一個子節(jié)點(znode)。controller在啟動時會在/admin/deletetopics創(chuàng)建一個監(jiān)聽器監(jiān)聽該節(jié)點的子節(jié)點是否發(fā)生變更。當(dāng)有新的子節(jié)點被創(chuàng)建時,controller立即開啟刪除Topic刪除邏輯。主要執(zhí)行兩步:
停止該Topic的所有副本
刪除副本日志數(shù)據(jù)
controller移除/admin/delete_topics/{待刪除topic節(jié)點},topic刪除完成
分區(qū)重分配主要為了對Topic下面的所有分區(qū)重新分配副本所在的broker機器,以期望實現(xiàn)更均勻的分配。該操作需要管理員手動定制分配方案,并按照指定格式寫入Zookeeper的/admin/reassign_partitions下。
分區(qū)重分配的過程是先擴展再收縮的過程。controller首先將分區(qū)副本進(jìn)行擴展,等他們?nèi)颗cLeader副本同步以后將Leader設(shè)置為新分配方案中的副本,最后執(zhí)行收縮,將分區(qū)副本減少為分配方案中的副本集合。
為了避免分區(qū)副本分配不均勻,引入preferred副本的概念,假設(shè)一個分區(qū)副本的列表是[1,2,3],那么broker1就是該分區(qū)的preferred leader。但是隨著時間的推進(jìn),分區(qū)leader發(fā)生變化,最后preferred leader不一定就是分區(qū)leader。
broker段參數(shù)auto.leader.reblance.enable設(shè)置true,controller會定時自動調(diào)整preferred leader
通過kafka-preferred-replica-election腳本觸發(fā)
上面兩種方法都會往Zookeeper的/admin/preferredreplicaelection節(jié)點寫入數(shù)據(jù)。controller也會注冊該節(jié)點的目錄監(jiān)聽器。一旦接收到改變通知,controller會將對應(yīng)分區(qū)的leader調(diào)整回副本列表中的第一個,并且廣播出去。
當(dāng)前增加分區(qū)通常通過kafka-topics.sh的--alert選項,它會向Zookeeper下的/brokers/topics/{待修改的Topic}中寫入新的分區(qū)目錄。
由于在創(chuàng)建Topic以后,會注冊一個監(jiān)聽該目錄變化監(jiān)聽器,因此當(dāng)目錄發(fā)生變化時,controller會收到通知,執(zhí)行分區(qū)創(chuàng)建任務(wù),之后更新集群元數(shù)據(jù)信息。
每個broker創(chuàng)建成功后,都會在Zookeeper的/brokers/ids節(jié)點下創(chuàng)建一個子節(jié)點,并寫入broker的信息。controller會在/brokers/ids創(chuàng)建一個監(jiān)聽該節(jié)點的子節(jié)點是否發(fā)生變化的監(jiān)聽器,一旦收到通知,然后就會更新集群元數(shù)據(jù)信息。
broker在加入集群時注冊的節(jié)點是個臨時節(jié)點,伴隨broker的崩潰,臨時節(jié)點消失,然后controller會收到通知,開啟關(guān)閉broker邏輯,并更新集群元數(shù)據(jù)信息。
受控關(guān)閉是指的以kafka-server-stop.sh或者kill -15的方式關(guān)閉kafka broker。
受控關(guān)閉是由即將關(guān)閉的broker向controller發(fā)送ControlledShutdownRequest。當(dāng)發(fā)送完請求后,broker處于阻塞狀態(tài),controller會進(jìn)行l(wèi)eader重選舉和ISR收縮調(diào)整后,會給broker發(fā)送ControlledShutdownResoponse,表示broker可以關(guān)閉。
當(dāng)所有broker一起啟動時,會爭先在Zookeeper上創(chuàng)建/controller臨時節(jié)點,并寫入controller broker的信息,Zookeeper可以保證只有一個broker可以創(chuàng)建成功,創(chuàng)建成功的broker節(jié)點還會更新/controller_epoch的值。沒有創(chuàng)建成功的broker監(jiān)聽/controller,加入controller宕機,其他broker將會收到通知,然后去競選controller。
controller啟動時會與集群中的所有broker(包括controller在的broker)建立TCP連接,并且會為每個TCP連接建立一個RequestSendThread,也就是說controller會和每個broker建立一個TCP連接,并且開啟一個I/O線程。
controller目前主要有以下三種請求:
UpdateMetaRequest:更新集群元數(shù)據(jù)請求,包含了集群的元數(shù)據(jù)信息。broker接收到該請求后,會更新本地的緩存信息
LeaderAndIsrRequest:用于創(chuàng)建分區(qū)和副本
StopReplicaRequest:停止指定副本的數(shù)據(jù)請求操作,另外還負(fù)責(zé)刪除副本數(shù)據(jù)功能。
“Kafka中Controller的作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!