您好,登錄后才能下訂單哦!
本篇內容介紹了“Kafka中Controller的作用是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Kafka除了狀態管理以外,還主要有以下功能職責:
更新集群元數據信息
創建Topic
刪除Topic
分區重分配
preferred leader副本選舉
Topic分區擴展
Broker加入集群
Broker崩潰
受控關閉
controller leader選舉
Client可以從任何一臺broker上獲取集群完整的元數據信息,這就需要controller在集群元數據信息發生變更后通知每一個broker。當有分區信息變更時,controller會將變更后的信息封裝進UpdateMetadataRequest請求中,然后發送給集群中的每個Broker。
Controller啟動時會創建一個Zookeeper監聽器,該監聽器的作用是監聽/brokers/topics下子節點的變化情況。
Topic在創建時首先會在/brokers/topics節點下面創建一個子節點(znode),并且將該Topic的分區和副本情況寫入這個znode中。當監聽器發現/brokers/topics有新增znode時,就會立即觸發controller創建Topic(為新的Topic每個分區確定Leader和ISR),然后更新集群元數據信息。
當創建完成以后,controller會創建一個新的監聽器/brokers/topics/{topic_name},監聽新的Topic內容的變更。這樣當Topic分區發生變化時,controller能夠及時收到通知。
Kafka集群刪除Topic都是向Zookeeper下的/admin/deletetopics下新增一個子節點(znode)。controller在啟動時會在/admin/deletetopics創建一個監聽器監聽該節點的子節點是否發生變更。當有新的子節點被創建時,controller立即開啟刪除Topic刪除邏輯。主要執行兩步:
停止該Topic的所有副本
刪除副本日志數據
controller移除/admin/delete_topics/{待刪除topic節點},topic刪除完成
分區重分配主要為了對Topic下面的所有分區重新分配副本所在的broker機器,以期望實現更均勻的分配。該操作需要管理員手動定制分配方案,并按照指定格式寫入Zookeeper的/admin/reassign_partitions下。
分區重分配的過程是先擴展再收縮的過程。controller首先將分區副本進行擴展,等他們全部與Leader副本同步以后將Leader設置為新分配方案中的副本,最后執行收縮,將分區副本減少為分配方案中的副本集合。
為了避免分區副本分配不均勻,引入preferred副本的概念,假設一個分區副本的列表是[1,2,3],那么broker1就是該分區的preferred leader。但是隨著時間的推進,分區leader發生變化,最后preferred leader不一定就是分區leader。
broker段參數auto.leader.reblance.enable設置true,controller會定時自動調整preferred leader
通過kafka-preferred-replica-election腳本觸發
上面兩種方法都會往Zookeeper的/admin/preferredreplicaelection節點寫入數據。controller也會注冊該節點的目錄監聽器。一旦接收到改變通知,controller會將對應分區的leader調整回副本列表中的第一個,并且廣播出去。
當前增加分區通常通過kafka-topics.sh的--alert選項,它會向Zookeeper下的/brokers/topics/{待修改的Topic}中寫入新的分區目錄。
由于在創建Topic以后,會注冊一個監聽該目錄變化監聽器,因此當目錄發生變化時,controller會收到通知,執行分區創建任務,之后更新集群元數據信息。
每個broker創建成功后,都會在Zookeeper的/brokers/ids節點下創建一個子節點,并寫入broker的信息。controller會在/brokers/ids創建一個監聽該節點的子節點是否發生變化的監聽器,一旦收到通知,然后就會更新集群元數據信息。
broker在加入集群時注冊的節點是個臨時節點,伴隨broker的崩潰,臨時節點消失,然后controller會收到通知,開啟關閉broker邏輯,并更新集群元數據信息。
受控關閉是指的以kafka-server-stop.sh或者kill -15的方式關閉kafka broker。
受控關閉是由即將關閉的broker向controller發送ControlledShutdownRequest。當發送完請求后,broker處于阻塞狀態,controller會進行leader重選舉和ISR收縮調整后,會給broker發送ControlledShutdownResoponse,表示broker可以關閉。
當所有broker一起啟動時,會爭先在Zookeeper上創建/controller臨時節點,并寫入controller broker的信息,Zookeeper可以保證只有一個broker可以創建成功,創建成功的broker節點還會更新/controller_epoch的值。沒有創建成功的broker監聽/controller,加入controller宕機,其他broker將會收到通知,然后去競選controller。
controller啟動時會與集群中的所有broker(包括controller在的broker)建立TCP連接,并且會為每個TCP連接建立一個RequestSendThread,也就是說controller會和每個broker建立一個TCP連接,并且開啟一個I/O線程。
controller目前主要有以下三種請求:
UpdateMetaRequest:更新集群元數據請求,包含了集群的元數據信息。broker接收到該請求后,會更新本地的緩存信息
LeaderAndIsrRequest:用于創建分區和副本
StopReplicaRequest:停止指定副本的數據請求操作,另外還負責刪除副本數據功能。
“Kafka中Controller的作用是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。