Kafka基礎 Kafka架構

2022-07-17 20:54:13 字數 2494 閱讀 4411

目錄kakfa 架構

kafka最初是由linkedin公司採用scala語言開發的乙個多分割槽、多副本並且基於zookeeper協調的分布式訊息系統,現在已經捐獻給了apache**會。目前kafka已經定位為乙個分布式流式處理平台,它以 高吞吐、可持久化、可水平擴充套件、支援流處理等多種特性而被廣泛應用。

kafka 是乙個分布式的基於發布/訂閱模式的訊息佇列(message queue),主要應用於大資料實時處理領域。

kafka中訊息是以topic(主題)進行分類的,生產者生產訊息,消費者消費訊息,都是面向topic的。乙個topic可以對應多個partition,如果分割槽規則設定的合理,那麼所有的訊息將會被均勻的分布到不同的分割槽中,這樣就實現了負載均衡和水平擴充套件。

多個訂閱者可以從乙個或者多個分割槽中同時消費資料,以支撐海量資料處理能力。 訊息是以追加到分割槽中的,多個分割槽順序寫磁碟的總效率要比隨機寫記憶體還要高(引用apache kafka – a high throughput distributed messaging system的觀點),是kafka高吞吐率的重要保證之一。

假設我們現在有乙個主題topic1,topic1下有乙個分割槽partition1,當partition1所在的broker出現故障宕機,kafka就不可用了,因此,為了提高kafka的高可用性和永續性,kafka使用了分割槽的副本機制。

乙個分割槽可以有多個副本,這些副本儲存在不同的broker上。每個分割槽的副本中都會有乙個作為leader。當乙個broker失敗時,leader在這台broker上的分割槽都會變得不可用,kafka會自動移除leader,再其他副本中選乙個作為新的leader。

在通常情況下,增加分割槽可以提供kafka集群的吞吐量。然而,也應該意識到集群的總分區數或是單台伺服器上的分割槽數過多,會增加不可用及延遲的風險。

我們往已經部署好的kafka集群裡面新增機器是最正常不過的需求,而且新增起來非常地方便,我們需要做的事是從已經部署好的kafka節點中複製相應的配置檔案,然後把裡面的broker id修改成全域性唯一的,最後啟動這個節點即可將它加入到現有kafka集群中。

但是問題來了,新新增的kafka節點並不會自動地分配資料,所以無法分擔集群的負載,除非我們新建乙個topic。但是現在我們想手動將部分分割槽移到新新增的kafka節點上,kafka內部提供了相關的工具來重新分布某個topic的分割槽。

按照kafka預設的消費邏輯設定,乙個分割槽只能被同乙個消費組(consumergroup)內的乙個消費者消費。假設目前某消費組內只有乙個消費者c0,訂閱了乙個topic,這個topic包含7個分割槽,也就是說這個消費者c0訂閱了7個分割槽,參考下圖

此時消費組內又加入了乙個新的消費者c1,按照既定的邏輯需要將原來消費者c0的部分分割槽分配給消費者c1消費,情形上圖(2),消費者c0和c1各自負責消費所分配到的分割槽,相互之間並無實質性的干擾。

接著消費組內又加入了乙個新的消費者c2,如此消費者c0、c1和c2按照上圖(3)中的方式各自負責消費所分配到的分割槽

如果消費者過多,出現了消費者的數量大於分割槽的數量的情況,就會有消費者分配不到任何分割槽。參考下圖,一共有8個消費者,7個分割槽,那麼最後的消費者c7由於分配不到任何分割槽進而就無法消費任何訊息。

消費者客戶端引數partition.asssignment.strategy可以配置多個分配策略,彼此之間以逗號分隔。

isr(in-sync replicas)

所有與leader部分保持一定程度的副(包括leader副本在內)本組成isr。

無論是生產者還是消費者,面向的都是topic,也就是主題中的分割槽。

主題中可以有多個分割槽,為了保證高可用和永續性,每個分割槽會存在有分布在不同broker上的副本。無論是生產還是消費訊息,都會只面向多個副本中的leader進行讀寫。

可以預見的是,如果某個分割槽的leader掛了,那麼其它跟隨者將會進行選舉產生乙個新的leader,之後所有的讀寫就會轉移到這個新的leader上 ,在kafka中,其不是採用常見的多數選舉的方式進行副本的leader選舉,而是會在zookeeper上針對每topic維護乙個稱為isr(in-sync replica,已同步的副本)的集合,顯然還有一些副本沒有來得及同步。只有這個isr列表裡面的才有資格成為leader (先使用isr裡面的第乙個,如果不行依次類推,因為isr裡面的是同步副本,訊息是最完整且各個節點都是一樣的) 通過isr,kafka需要的冗餘度較低,可以容忍的失敗數比較高。假設某個topic有f+1個副本,kafka可以容忍f個不可用,當然,如果全部isr裡面的副本都不可用,也可以選擇其他可用的副本,只是存在資料的不一致。

Kafka 基礎架構

1 producer 訊息生產者,就是向 kafka broker 發訊息的客戶端 2 consumer 訊息消費者,向 kafka broker 取訊息的客戶端 3 consumer group cg 消費者組,由多個 consumer 組成。消費者組內每個消費者負責消費不同分割槽的資料,乙個分割...

Kafka基礎架構

1 producer 訊息生產者,就是向 kafka broker 發訊息的客戶端 2 consumer 訊息消費者,向 kafka broker 取訊息的客戶端 3 consumer group cg 消費者組,由多個 consumer 組成。消費者組內每個消費者負責消費不同分割槽的資料,乙個分割...

Kafka基礎架構

1 producer 訊息生產者,就是向kafka broker發訊息的客戶端 2 consumer 訊息消費者,向kafka broker取訊息的客戶端 3 consumer group cg 消費者組,由多個consumer組成。消費者組內每個消費者負責消費不同分割槽的資料,乙個分割槽只能由乙個...