kafka常見的叢集部署模式
1. Hub架構。一箇中心的kafka叢集做中央排程,對應多個本地的kafka叢集。
變種是一個關鍵的kafka叢集對應一個非關鍵的跟隨者
- 優點:只有本地用到的資料就在本地使用,多個資料中心需要用到的資料就放在中央,從本地同步到遠端的次數也就只有一次,這樣讀取的時候,需要本地的就本地讀,否則遠端讀,也就是消費者只需要從一個叢集讀資料即可
- 缺點:一個資料中心的不能訪問另一資料中心的
2. 雙活架構。 多個叢集之間保持資料同步。
- 優點:一個叢集掛掉可以直接轉向另外一個,而且可以就近的提供服務
- 缺點:叢集之間同步資料如何避免衝突,保證資料一致性
3. 主備架構。有兩個叢集,平常只用主叢集, 另外一個叢集只有當主叢集出了問題才用。
- 優點:不需要擔心資料訪問和衝突問題
- 缺點:有一個叢集的資源浪費,同時需要考慮備份的量的問題,以及恢復的過程中是否可以重複資料或者丟失部分資料
4. 延展叢集。單個資料中心故障的時候,重新定位到另一個資料中心 。
- 優點:有一定的災備能力,一箇中心掛了,使用另一個,延展叢集不是多個叢集而是一個叢集,使用的方式是kafka內部的複製機制,把資料放到其他的broker,而不是叢集之間的複製與同步
- 缺點:kafka本身出了問題無法避免
新節點的新建與關閉
- 新建節點;每個broker都有一個唯一的識別符號,新的broker啟動的時候,會建立一個臨時節點,把自己的ID註冊到zk,如果zk中已經有一個一樣的ID存在,會得到錯誤,註冊失敗。如果註冊成功,且叢集中有著一個與新ID一樣的舊ID副本,那麼新的broker會立即加入叢集,並擁有與舊broker相同的分割槽和主題
- 節點異常/關閉;啟動時穿件的臨時節點會從zk上自動移除,監聽broker列表的kafka元件會被告知該broker已經移除,broker對應節點消失,但是它的ID會繼續存在於其他資料結構中
比如主題副本列表
什麼是副本?
分割槽資料的拷貝。分為兩種型別:
1. 首領副本。負責分清那個跟隨者狀態與自己一致。每個分割槽都有一個,所有生產者和消費者請求都會經過它。
2. 跟隨者副本。首領以外的副本。不處理客戶端的請求。僅從首領複製訊息,如果首領崩潰,他們中的同步副本會被提升為新首領。
首領與跟隨者之間的訊息同步
在有新訊息到達時,跟隨者會向首領傳送獲取資料的請求。一個跟隨者副本首先請求訊息1,然後訊息2,然後訊息3;如果沒有收到這3個訊息的響應,不會再次請求訊息4。
持續請求最新訊息的副本也被稱作同步的副本
如果跟隨者傳送了請求訊息4,,那麼知道訊息被同步了,如果跟隨者10s內沒有請求訊息,或者沒有請求最新的訊息,此跟隨者被當做不同步。
沒有同步的副本是不可能成為新的首領的
首選首領
建立主題時候選定的首領即分割槽首選首領。如果首選首領不是當前首領,並且該副本是同步的,就會觸發首領選舉,使得首選首領稱為當前首領
如何對訊息進行分割槽?
kafka具備預設的分割槽器。如果key沒有,就通過Round robin演算法將訊息傳送到各個可用的分割槽上,如果key存在,就對鍵進行雜湊
只有主題分割槽數不可變的時候,對映才有用
如何分配分割槽?
建立主題的時候,kafka先決定broker的分配。它的總原則是:broker之間平均分步分割槽副本
;每個分割槽的副本分佈在不同的broker上
輪詢,比如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方法或者重啟。
自己分配分割槽後是不會發生再均衡以及手動查詢分割槽,其餘一樣
消費者與消費分割槽是如何對應的?
消費者從屬於一個消費群組,一個群組裡的消費者訂閱同一個主題,每個消費者接受主題一部分分割槽的訊息。消費者的數量應該小於等於分割槽的數量,如果消費者的數量超過分割槽數,那麼超過部分會被閒置。不同消費組群互相不影響,如果一個應用要處理多個主題,可以讓多個主題公用一個消費者群組