技術10期:什麼是Kafka?【全解析】

Kafka是最初由Linkedin公司開發,是一個分佈式、支持分區的、多副本的,基於zookeeper協調的分佈式消息系統。

 

它最大的特性就是可以實時處理大量數據以滿足各種需求場景:比如基於hadoop的批處理系統、低延遲的實時系統、storm/Spark流式處理引擎,web/nginx日誌、訪問日誌、消息服務等等。


Linkedin於2010年貢獻給了Apache基金會併成爲頂級開源項目

 

 

01 kafka的定義和特徵

 

Kafka是一個分佈式的基於發佈/訂閱模式的消息隊列,主要用來解決應用解耦、異步消息、流量削峯等問題。

 

3個特點

 

  • 類似消息系統,提供事件流的發佈和訂閱,即具備數據注入功能

  • 存儲事件流數據的節點具有故障容錯的特點,即具備數據存儲功能

  • 能夠對實時的事件流進行流式地處理和分析,即具備流處理功能

 

 

02 Kafka的架構

 

 

  • Producer:消息生產者,就是向 kafka broker 發消息的客戶端

 

  • Consumer:消息消費者,就是向 kafka broker 取消息的客戶端

 

  • Broker :一臺 kafka 服務器就是一個 broker。一個集羣由多個 broke 組成。一個 broker 可以容納多個 topic

 

  • Consumer Group (CG):消費者組,由多個 consumer 組成。消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個組內消費者消費;消費者組之間互不影響

 

  • Topic :可以理解爲一個隊列,生產者和消費者面向的都是一個 topic  

 

  • Partition:爲了實現擴展性,一個非常大的 topic 可以分佈到多個 broker(即服務 器)上,一個 topic 可以分爲多個 partition,每個 partition 是一個有序的隊列

 

  • Replica:副本,爲保證集羣中的某個節點發生故障時,該節點上的 partition 數據 不丟失,且 kafka 仍然能夠繼續工作,kafka 提供了副本機制,一個 topic 的每個分區都有若干個副本, 一個 leader 和若干個 follower

 

  • leader:每個分區多個副本的「主」,生產者發送數據的對象,以及消費者消費數 據的對象都是 leader

     

  • follower:每個分區多個副本中的「從」,實時從 leader 中同步數據,保持和 leader數據 的同步。leader 發生故障時,某個 follower 會成爲新的 follower

 

 

03 生產者

 

(1)  數據可靠性保證

 

 

爲保證 producer 發送的數據,能可靠的發送到指定的 topic,topic 的每個 partition 收到 producer 發送的數據後,都需要向 producer 發送ack(acknowledgement 確認收到),如果 producer 收到 ack,就會進行下一輪的發送,否則重新發送數據。

 

(2)  Ack應答機制

 

  • Ack=0:producer 不等待 broker 的 ack,這一操作提供了一個最低的延遲,broker 一接收到還沒有寫入磁盤就已經返回,當 broker 故障時有可能丟失數據

 

  • Ack=1:producer 等待 broker 的 ack,partition 的 leader 落盤成功後返回 ack,如果在 follower 同步成功之前 leader 故障,那麼將會丟失數據

 

  • Ack=-1:producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落 盤成功後才 返回 ack。但是如果在 follower 同步完成後,broker 發送 ack 之前,leader 發生故障,那麼會造成數據重複

 

(3) 故障處理

 

 

  • follower 故障

 

follower發生故障後會被臨時踢出ISR,待該follower 恢復後,follower會讀取本地磁盤 記錄的上次的HW,並將log文件高於HW的部分截取掉,從HW開始向leader進行同步。

 

等該follower的LEO大於等於該Partition的HW,即 follower 追上 leader 之後,就可以重新加入ISR 了。

 

  • leader 故障

 

leader 發生故障之後,會從 ISR 中選出一個新的 leader,之後,爲保證多個副本之間的數據一致性,其餘的follower 會先將各自的log文件高於 HW 的部分截掉,然後從新的 leader同步數據。

 

 

04 消費者

 

(1) 消費方式

 

consumer 採用 pull(拉) 模式從 broker 中讀取數據。push(推)模式很難適應消費速率不同的消費者,因爲消息發送速率是由 broker 決定的。

 

它的目標是儘可能以最快速度傳遞消息,但是這樣很容易造成 consumer 來不及處理消息,典型的表現就是拒絕服務以及網絡擁塞。

 

而 pull 模式則可以根據 consumer 的消費能力以適當的速率消費消息。pull 模式不足之處是,如果 kafka 沒有數據,消費者可能會陷入循環中,一直返回空數據。

 

針對這一點,Kafka的消費者在消費數據時會傳入一個時長參數timeout,如果當前沒有數據可供消費,consumer 會等待一段時間之後再返回,這段時長即爲 timeout。

 

(2) Offset的維護

 

 

 

由於 consumer 在消費過程中可能會出現斷電宕機等故障,consumer 恢復後,需要從故障前的位置的繼續消費,所以 consumer 需要實時記錄自己消費到了哪個 offset,以便故障恢復後繼續消費。

 

Kafka 0.9 版本之前,consumer 默認將 offset 保存在 Zookeeper 中,從 0.9 版本開始,consumer 默認將 offset 保存在 Kafka 一個內置的 topic 中,該 topic爲__consumer_offsets。

 

總結:

 

Kafka是一個分佈式、支持分區的、多副本的,基於zookeeper協調的分佈式消息系統,是當前大數據解決方案的標配,廣泛用於大數據框架間的數據發佈和訂閱,所以深入理解Kafka內部機制就非常必要。

 - 完 -

想了解更多關於人工智能的資訊

歡迎關注普適極客