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內部機制就非常必要。
- 完 -
想了解更多關於人工智能的資訊
歡迎關注普適極客