快速入門Kafka

說明:如下內容爲我的學習kafka的筆記整理,現整理成文章分享,若是對讀者有些幫助那就再好不過了。圖片有一部分是本身畫的,有一部分來自於百度圖片,如有侵襲,請留言,我會刪除。內容上如有不完善的地方,歡迎讀者留言指出,筆者會盡快勘正,謝謝!

Kafka概述

kafka是什麼?

kafka是分佈式的、高併發的、基於發佈/訂閱模式的消息隊列軟件系統。緩存

kafka是一個基於發佈/訂閱模式的消息隊列

image

kafka對外使用topic的概念,生產者往topic裏寫消息,消費者組的消費者從topic裏讀消息。併發

  1. 生產者向kafka集羣PUSH消息,消費者組用長連接從kafka集PULL消息。
  2. kafka集羣具備持久化消息的能力
  3. 消費者以消費者組的方式存在,同一個topicA的消息最多隻會被整個消費者組消費一次。

kafka是一個高併發的基於發佈/訂閱模式的消息隊列

image

爲了提升某個topic的負載能力,kafka的一個topic是由多個分區(Partition)組成。生產者根據必定的規則向多個分區PUSH數據,消費者組的多個消費者能夠同時消費不一樣分區裏的消息。異步

  1. 消費者組保證一個topic的每個分區都有消費者進行消費。
  2. 生產者儘可能均勻地向一個topic的每個分區PUSH消息。
  3. kafka保證了同一個主題的區內有序,不保證主題的全局有序性。

kafka是分佈式的、高併發的、基於發佈/訂閱模式的消息隊列軟件系統。

image

爲保證可用性,kafka的每個分區都能配置N個副本。副本分爲Leader副本和Follower副本,Follower僅負責從Leader複製數據,Leader負責全部的讀寫請求。kafka集羣實際存儲的是副本。分佈式

  1. Kafka集羣的每個單機爲一個Broker。Broker 會向 zookeeper 發送心跳請求來上報本身的狀態。zookeeper 維護了一個正在運行而且屬於集羣的 broker 列表。
  2. Kafka集羣中的多個broker會有一個broker被選舉爲控制器(Kafka Controller),它負責管理整個集羣中全部分區和副本的狀態:當某個分區的leader副本出現故障時,由控制器負責爲該分區選舉新的leader副本
  3. 主題分區副本在broker的分配原則:每一個Broker都有均等分配分區Leader的機會,同個分區的副本不能落到同一臺機器上!具體規則:高併發

    1. 將全部N Broker和待分配的i個Partition排序。
    2. 將第i個Partition分配到第(i mod n)個Broker上。
    3. 將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker。

因此kafka是

Kafka是一個分佈式、分區的、多副本的、多訂閱者,基於zookeeper協調的分佈式MQ系統。學習

image

生產者與kafka集羣

生產者分區選擇策略

  • 輪詢:消費者依次向每個分區發送數據
  • 隨機:消費者隨機向某一個分區發送數據
  • 散列:消費者按照消息鍵的hashcode%分區數,向指定分區發送數據
  • 自定義分區選擇策略:生產者實現kafka提供的PartitionAssignor接口,自定義分區選擇策略。

爲提升發送效率,生產者一般將多條消息打包PUSH到kafka集羣。spa

分區什麼時候返回給生產者ACK?副本同步機制!

分區的Leader副本負責讀寫,Leader副本收到來着生產者的消息並寫入本地的同時,也會將消息發給對應的Follower副本,Follower寫入本地後返回給Leader ACK,Leader收到必定數量的Follower的ACK之後再返回給生產者ACK表示消息已寫入Kafka集羣。kafka的副本同步不是徹底同步,也不是徹底異步,而是一種ISR機制。code

kafka的ISR機制

leader會維護一個與其基本保持同步的Replica列表,該列表稱爲ISR(in-sync Replica),每一個Partition都會有一個ISR,並且是由leader動態維護。blog

  • 若是一個Follower超過必定時間未發起數據複製請求,則leader將其從ISR中移除。
  • 若是一個Follower的消息偏移量追遇上Leader的同步消息偏移量,則leader將其放入ISR中。

Leader收到ISR裏的所有Follower的ACK之後再向發送者回復ACK。排序

若主從數據沒有徹底同步完,Leader掛掉,會不會丟失數據?主從一致性問題!

image

image

  • LEO:每個副本的最後一個偏移量
  • HW:全部副本中最小的LEO

HW以後的數據對消費者不可見,當leader掛掉之後,就從ISR裏選舉一個新的leader。以後,爲保證多個副本之間的數據一致性,其他的Follower都會將各自消息文件高於hw的部分截掉,而後重新的leader同步數據。

若kafka集羣沒有及時回覆ACK,生產者重複發送消息怎麼辦?

  • 精準一次性=重複數據(至少一次)+ 冪等性
  • 冪等性:不管調用者發送多少次消息,服務端都只處理一次。

kafka集羣會給開啓冪等性的生產者在初始化的時候會分配一個PID。生產者發往同一個分區(Partition)的每個消息會附帶上一個序列號(SeqNumber)。Broker端會對<PID,Partition,SeqNumber>作緩存,當具備相同序列號的消息提交時,Broker只會持久化一條消息。

但生產者的PID在重啓之後會變化,同時不一樣的分區也具備不一樣序列號,因此冪等性沒法保證跨分區跨會話的精準一次性。

kafka集羣與消費者

消費者爲什麼選擇從kafka集羣PULL消息

  • Push模式:很難適應消費速率不一樣的消費者,由於消費發送速率是由broker決定的。它的目標是儘量以最快的速度傳遞消息,這樣很容易形成consumer來不及消費消息。
  • Pull模式: 若是kafka沒有數據,消費者會陷入循環中,一直返回空數據。能夠傳入一個timeout參數,若是沒有數據可供消費consumer就等待一段時間以後再返回。

Push模式和Pull模式都有各自的優點和缺點,相較之下,Kafka選擇了Pull模式,以提升整個集羣的消費能力

消費者消費哪一個分區?消費分區分配策略!

需保證兩個原則:全部的分區的消息都有消費者進行消費,不可能出現同一個消費者組的多個個消費者負責同一個分區。

  • RoundRobin輪詢:將消費組內全部消費者以及消費者所訂閱的全部topic的partition按照字典序排序,而後經過輪詢方式逐個將分區以此分配給每一個消費者。

image

  • Range範圍:將消費者總數和分區總數進行整除運算來得到一個跨度,而後將分區按照跨度進行平均分配,以保證分區儘量均勻地分配給全部的消費者。

image

以上內容圖片均來自於百度圖片,侵刪!!!

相關文章
相關標籤/搜索