初識kafka集羣

kafka常見的集羣部署模式算法

1. Hub架構。一箇中心的kafka集羣作中央調度,對應多個本地的kafka集羣。數據結構

變種是一個關鍵的kafka集羣對應一個非關鍵的跟隨者
  • 優勢:只有本地用到的數據就在本地使用,多個數據中心須要用到的數據就放在中央,從本地同步到遠程的次數也就只有一次,這樣讀取的時候,須要本地的就本地讀,不然遠程讀,也就是消費者只須要從一個集羣讀數據便可
  • 缺點:一個數據中心的不能訪問另外一數據中心的

2. 雙活架構。 多個集羣之間保持數據同步。
架構

  • 優勢:一個集羣掛掉能夠直接轉向另一個,並且能夠就近的提供服務
  • 缺點:集羣之間同步數據如何避免衝突,保證數據一致性

3. 主備架構。有兩個集羣,日常只用主集羣, 另一個集羣只有當主集羣出了問題才用。
code

  • 優勢:不須要擔憂數據訪問和衝突問題
  • 缺點:有一個集羣的資源浪費,同時須要考慮備份的量的問題,以及恢復的過程當中是否能夠重複數據或者丟失部分數據

4. 延展集羣。單個數據中心故障的時候,從新定位到另外一個數據中心 。
對象

  • 優勢:有必定的災備能力,一箇中心掛了,使用另外一個,延展集羣不是多個集羣而是一個集羣,使用的方式是kafka內部的複製機制,把數據放到其餘的broker,而不是集羣之間的複製與同步
  • 缺點:kafka自己出了問題沒法避免


新節點的新建與關閉

  1. 新建節點;每一個broker都有一個惟一的標識符,新的broker啓動的時候,會建立一個臨時節點,把本身的ID註冊到zk,若是zk中已經有一個同樣的ID存在,會獲得錯誤,註冊失敗。若是註冊成功,且集羣中有着一個與新ID同樣的舊ID副本,那麼新的broker會當即加入集羣,並擁有與舊broker相同的分區和主題
  2. 節點異常/關閉;啓動時穿件的臨時節點會從zk上自動移除,監聽broker列表的kafka組件會被告知該broker已經移除,broker對應節點消失,可是它的ID會繼續存在於其餘數據結構中
好比主題副本列表

什麼是副本?

分區數據的拷貝。分爲兩種類型:
1. 首領副本。負責分清那個跟隨者狀態與本身一致。每一個分區都有一個,全部生產者和消費者請求都會通過它。
2. 跟隨者副本。首領之外的副本。不處理客戶端的請求。僅從首領複製消息,若是首領崩潰,他們中的同步副本會被提高爲新首領。

首領與跟隨者之間的消息同步

在有新消息到達時,跟隨者會向首領發送獲取數據的請求。一個跟隨者副本首先請求消息1,而後消息2,而後消息3;若是沒有收到這3個消息的響應,不會再次請求消息4。  資源

持續請求最新消息的副本也被稱做同步的副本

若是跟隨者發送了請求消息4,,那麼知道消息被同步了,若是跟隨者10s內沒有請求消息,或者沒有請求最新的消息,此跟隨者被當作不一樣步。部署

沒有同步的副本是不可能成爲新的首領的

首選首領

建立主題時候選定的首領即分區首選首領。若是首選首領不是當前首領,而且該副本是同步的,就會觸發首領選舉,使得首選首領稱爲當前首領kafka

如何對消息進行分區?

kafka具有默認的分區器。若是key沒有,就經過Round robin算法將消息發送到各個可用的分區上,若是key存在,就對鍵進行散列同步

只有主題分區數不可變的時候,映射纔有用

如何分配分區?

建立主題的時候,kafka先決定broker的分配。它的總原則是:broker之間平均分步分區副本;每一個分區的副本分佈在不一樣的broker上it

輪詢,好比broker0是首領,那麼1是跟隨者,類推。若是有機架信息,會盡量使得副本分配到不一樣機架上。
分配好副本以後,選擇數據存儲目錄,每一個分區會有單獨的目錄,新的分區總被添加到分區數小的目錄裏面

假設有新磁盤,那麼新分區會在新磁盤上。注意這裏沒有考慮分區的大小,僅僅看數量

控制器與集羣的關係

控制器自己是一個兼具分區首領選舉的broker

1. 集羣中第一個啓動的broker經過在zk中建立一個臨時節點 /controller 使本身成爲控制器。其它節點啓動時一樣會進行這個操做,但只會收到 節點點存在 的異常,其它節點只會在 控制器節點上建立zk watch對象接收節點的變動通知
確保集羣只有一個控制器
2. 控制器關閉或者異常時,watch對象告知各個broker,他們進而嘗試成爲控制器,第一個成功的會成爲控制器,其它則建立watch對象。新的控制器會得到更大的controller epoch,其它broker獲知當前的epoch以後,若是發現比當前要小的epoch則忽略


3. 有節點退出時,若是broker包含首領,則控制器遍歷分區肯定新首領,而後向包含新首領或現有的跟隨者發請求消息,告知誰是新首領和誰是分區跟隨者。新broker加入時,檢查broker ID是否有現成的分區副本,有的話變動消息發送給新的broker和其它broker,新broker上副本開始從首領複製消息

分區新增時,消費者如何處理?

新增分區會發生分區重分配。

消費者羣組新加入消費者怎麼處理?

1. 新加入的消費者它讀取的消息是本來屬於其它消費者讀取的消息,一個消費者關閉或者崩潰則離開羣組,本來應該被它讀取的消息由其它消費者接受。
2. 再均衡。即分區的全部權從一個消費者轉移到另外一個消費者。這個過程當中,消費者羣沒法處理消息。
3. 分區的全部權則經過消費者向被指派的 羣組協調器 的broker發送心跳來維持,同時消費者的心跳行爲也用來維持和羣組的從屬關係。若是消費者中止發送心跳的時間足夠長,會話會過時,羣組協調器認爲它已經死亡,觸發再均衡

第一個加入消費組的是羣組。負責給每個消費者分配分區

能不能不要消費組?

能夠。一個消費者能夠本身訂閱主題並加入消費組,或者爲本身分配分區

不能同時作這兩件事

不過度配分區若是主題添加了新的分區,消費者不會收到通知,須要週期性的調用consumer.partitionsFor方法或者重啓。

本身分配分區後是不會發生再均衡以及手動查找分區,其他同樣


消費者與消費分區是如何對應的?

消費者從屬於一個消費羣組,一個羣組裏的消費者訂閱同一個主題,每一個消費者接受主題一部分分區的消息。消費者的數量應該小於等於分區的數量,若是消費者的數量超過度區數,那麼超過部分會被閒置。不一樣消費組羣互相不影響,若是一個應用要處理多個主題,可讓多個主題公用一個消費者羣組

相關文章
相關標籤/搜索