開始讀朱小廝的部落格

2021-09-27 02:34:11 字數 1390 閱讀 9038

重點:有乙個broker會被選舉為控制器(kafka controller),它負責管理整個集群中所有分割槽和副本的狀態

kafka中的控制器選舉的工作依賴於zookeeper,成功競選為控制器的broker會在zookeeper中建立/controller這個臨時(ephemeral)節點 (version在目前版本中固定為1,brokerid表示稱為控制器的broker的id編號,timestamp表示競選稱為控制器時的時間戳)

在任意時刻,集群中有且僅有乙個控制器

zookeeper中還有乙個與控制器有關的/controller_epoch節點,這個節點是持久(persistent)節點,節點中存放的是乙個整型的controller_epoch值

每個和控制器互動的請求都會攜帶上controller_epoch這個字段,如果請求的controller_epoch值小於記憶體中的controller_epoch值,則認為這個請求是向已經過期的控制器所傳送的請求,那麼這個請求會被認定為無效的請求。如果請求的controller_epoch值大於記憶體中的controller_epoch值,那麼則說明已經有新的控制器當選了

kafka通過controller_epoch來保證控制器的唯一性,進而保證相關操作的一致性。

具備控制器身份的broker需要比其他普通的broker多乙份職責,具體細節如下:

1.監聽partition相關的變化。

2.監聽topic相關的變化

3.監聽broker相關的變化

4.從zookeeper中讀取獲取當前所有與topic、partition以及broker有關的資訊並進行相應的管理

5.啟動並管理分割槽狀態機和副本狀態機。

6.更新集群的元資料資訊。

7.如果引數auto.leader.rebalance.enable設定為true,則還會開啟乙個名為「auto-leader-rebalance-task」的定時任務來負責維護分割槽的優先副本的均衡。

kafka的控制器使用單執行緒基於事件佇列的模型,將每個事件都做一層封裝,然後按照事件發生的先後順序暫存到linkedblockingqueue中,然後使用乙個專用的執行緒(controllereventthread)按照fifo(first input first output, 先入先出)的原則順序處理各個事件,這樣可以不需要鎖機制就可以在多執行緒間維護執行緒安全。

觸發新一輪的選舉

當/controller節點被刪除時(如果broker在節點被刪除前是控制器的話,在選舉前還需要有乙個「退位」的動作)

可以手動刪除/controller節點來觸發新一輪的選舉

關閉控制器所對應的broker

手動向/controller節點寫入新的brokerid的所對應的資料

開始讀叔本華的書了

前天去光谷書城,本來想買那本我很想買的 演算法引論 的,居然沒想到的是,都已經賣完了,好失望呀,不過我想我一定要買那本書的了,覺得自己現在的知識結構太淺,以後很難找個好工作了,所以學習呀,非常必要的.這兩天大家都開始找暑期實習生了,可是自己卻什麼沒有,今天來了一家公司,可是是做石油產品的,我興趣又不...

作為技術部落格的開始

很早之前就打算開乙個技術部落格,中間經歷了各種折騰。用過worpress然後自己買網域名稱,那還是高中的時候,寫了很多io的題解,因為後來不搞競賽也就沒再維護。前不久用過github hexo搭建靜態部落格,因為自己平時時間太少,維護起來有點麻煩,所以沒寫什麼就再懶得去弄了。最終還是覺得,雖然已經是...

開始我的技術部落格

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 歡迎來到我的部落格!以下是使用方式說明。你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯...