kafka常見的集羣部署模式算法
1. Hub架構。一箇中心的kafka集羣作中央調度,對應多個本地的kafka集羣。數據結構
變種是一個關鍵的kafka集羣對應一個非關鍵的跟隨者
2. 雙活架構。 多個集羣之間保持數據同步。
架構
3. 主備架構。有兩個集羣,日常只用主集羣, 另一個集羣只有當主集羣出了問題才用。
code
4. 延展集羣。單個數據中心故障的時候,從新定位到另外一個數據中心 。
對象
好比主題副本列表
在有新消息到達時,跟隨者會向首領發送獲取數據的請求。一個跟隨者副本首先請求消息1,而後消息2,而後消息3;若是沒有收到這3個消息的響應,不會再次請求消息4。 資源
持續請求最新消息的副本也被稱做同步的副本
若是跟隨者發送了請求消息4,,那麼知道消息被同步了,若是跟隨者10s內沒有請求消息,或者沒有請求最新的消息,此跟隨者被當作不一樣步。部署
沒有同步的副本是不可能成爲新的首領的
建立主題時候選定的首領即分區首選首領。若是首選首領不是當前首領,而且該副本是同步的,就會觸發首領選舉,使得首選首領稱爲當前首領kafka
kafka具有默認的分區器。若是key沒有,就經過Round robin算法將消息發送到各個可用的分區上,若是key存在,就對鍵進行散列同步
只有主題分區數不可變的時候,映射纔有用
建立主題的時候,kafka先決定broker的分配。它的總原則是:broker之間平均分步分區副本
;每一個分區的副本分佈在不一樣的broker上it
輪詢,好比broker0是首領,那麼1是跟隨者,類推。若是有機架信息,會盡量使得副本分配到不一樣機架上。分配好副本以後,選擇數據存儲目錄,每一個分區會有單獨的目錄,新的分區總被添加到分區數小的目錄裏面
假設有新磁盤,那麼新分區會在新磁盤上。注意這裏沒有考慮分區的大小,僅僅看數量
控制器自己是一個兼具分區首領選舉的broker
確保集羣只有一個控制器2. 控制器關閉或者異常時,watch對象告知各個broker,他們進而嘗試成爲控制器,第一個成功的會成爲控制器,其它則建立watch對象。新的控制器會得到更大的controller epoch,其它broker獲知當前的epoch以後,若是發現比當前要小的epoch則忽略
3. 有節點退出時,若是broker包含首領,則控制器遍歷分區肯定新首領,而後向包含新首領或現有的跟隨者發請求消息,告知誰是新首領和誰是分區跟隨者。新broker加入時,檢查broker ID是否有現成的分區副本,有的話變動消息發送給新的broker和其它broker,新broker上副本開始從首領複製消息
新增分區會發生分區重分配。
1. 新加入的消費者它讀取的消息是本來屬於其它消費者讀取的消息,一個消費者關閉或者崩潰則離開羣組,本來應該被它讀取的消息由其它消費者接受。
2. 再均衡。即分區的全部權從一個消費者轉移到另外一個消費者。這個過程當中,消費者羣沒法處理消息。
3. 分區的全部權則經過消費者向被指派的 羣組協調器 的broker發送心跳來維持,同時消費者的心跳行爲也用來維持和羣組的從屬關係。若是消費者中止發送心跳的時間足夠長,會話會過時,羣組協調器認爲它已經死亡,觸發再均衡
第一個加入消費組的是羣組。負責給每個消費者分配分區
能夠。一個消費者能夠本身訂閱主題並加入消費組,或者爲本身分配分區
不能同時作這兩件事
不過度配分區若是主題添加了新的分區,消費者不會收到通知,須要週期性的調用consumer.partitionsFor方法或者重啓。
本身分配分區後是不會發生再均衡以及手動查找分區,其他同樣
消費者從屬於一個消費羣組,一個羣組裏的消費者訂閱同一個主題,每一個消費者接受主題一部分分區的消息。消費者的數量應該小於等於分區的數量,若是消費者的數量超過度區數,那麼超過部分會被閒置。不一樣消費組羣互相不影響,若是一個應用要處理多個主題,可讓多個主題公用一個消費者羣組