天天看點

Kafka:Kafka核心概念

作者:日拱一卒程式猿

一、Producer

生産者建立消息。

該角色将消息釋出到Kafka的topic中。broker接收到生産者發送的消息後,broker将該消息追加到 目前用于追加資料的 segment 檔案中。

一般情況下,一個消息會被釋出到一個特定的主題上。

1. 預設情況下通過輪詢把消息均衡地分布到主題的所有分區上。

2. 在某些情況下,生産者會把消息直接寫到指定的分區。這通常是通過消息鍵和分區器來實作 的,分區器為鍵生成一個散列值,并将其映射到指定的分區上。這樣可以保證包含同一個鍵的 消息會被寫到同一個分區上。

3. 生産者也可以使用自定義的分區器,根據不同的業務規則将消息映射到分區。

二、Consumer

消費者讀取消息。

1. 消費者訂閱一個或多個主題,并按照消息生成的順序讀取它們。

2. 消費者通過檢查消息的偏移量來區分已經讀取過的消息。偏移量是另一種中繼資料,它是一個不 斷遞增的整數值,在建立消息時,Kafka 會把它添加到消息裡。在給定的分區裡,每個消息的 偏移量都是唯一的。消費者把每個分區最後讀取的消息偏移量儲存在Zookeeper 或Kafka 上,如果消費者關閉或重新開機,它的讀取狀态不會丢失。

3. 消費者是消費組的一部分。群組保證每個分區隻能被一個消費者使用。

4. 如果一個消費者失效,消費組裡的其他消費者可以接管失效消費者的工作,再平衡,分區重新 配置設定。

Kafka:Kafka核心概念

三、Broker

一個獨立的Kafka 伺服器被稱為broker。

broker 為消費者提供服務,對讀取分區的請求作出響應,傳回已經送出到磁盤上的消息。

1. 如果某topic有N個partition,叢集有N個broker,那麼每個broker存儲該topic的一個 partition。

2. 如果某topic有N個partition,叢集有(N+M)個broker,那麼其中有N個broker存儲該topic的一 個partition,剩下的M個broker不存儲該topic的partition資料。

3. 如果某topic有N個partition,叢集中broker數目少于N個,那麼一個broker存儲該topic的一 個或多個partition。在實際生産環境中,盡量避免這種情況的發生,這種情況容易導緻Kafka 叢集資料不均衡。

broker 是叢集的組成部分。每個叢集都有一個broker 同時充當了叢集控制器的角色(自動從叢集 的活躍成員中選舉出來)。

控制器負責管理工作,包括将分區配置設定給broker 和監控broker。

在叢集中,一個分區從屬于一個broker,該broker 被稱為分區的首領。

Kafka:Kafka核心概念

四、Topic

每條釋出到Kafka叢集的消息都有一個類别,這個類别被稱為Topic。 實體上不同Topic的消息分開存儲。 主題就好比資料庫的表,尤其是分庫分表之後的邏輯表。

五、Partition

1. 主題可以被分為若幹個分區,一個分區就是一個送出日志。

2. 消息以追加的方式寫入分區,然後以先入先出的順序讀取。

3. 無法在整個主題範圍内保證消息的順序,但可以保證消息在單個分區内的順序。

4. Kafka 通過分區來實作資料備援和伸縮性。

5. 在需要嚴格保證消息的消費順序的場景下,需要将partition數目設為1。

Kafka:Kafka核心概念

六、Replicas

Kafka 使用主題來組織資料,每個主題被分為若幹個分區,每個分區有多個副本。那些副本被儲存 在broker 上,每個broker 可以儲存成百上千個屬于不同主題和分區的副本。 副本有以下兩種類型:

首領副本

每個分區都有一個首領副本。為了保證一緻性,所有生産者請求和消費者請求都會經過這個副本。

跟随者副本

首領以外的副本都是跟随者副本。跟随者副本不處理來自用戶端的請求,它們唯一的任務就是從首領那裡複制消息,保持與首領一緻的狀态。如果首領發生崩潰,其中的一個跟随者會被提升為新首領。

七、Offset

生産者Offset

消息寫入的時候,每一個分區都有一個offset,這個offset就是生産者的offset,同時也是這個分區 的最新最大的offset。 有些時候沒有指定某一個分區的offset,這個工作kafka幫我們完成。

Kafka:Kafka核心概念

消費者Offset

Kafka:Kafka核心概念

這是某一個分區的offset情況,生産者寫入的offset是最新最大的值是12,而當Consumer A進行消 費時,從0開始消費,一直消費到了9,消費者的offset就記錄在9,Consumer B就紀錄在了11。等下一 次他們再來消費時,他們可以選擇接着上一次的位置消費,當然也可以選擇從頭消費,或者跳到最近的 記錄并從“現在”開始消費。

八、 副本

Kafka通過副本保證高可用。副本分為首領副本(Leader)和跟随者副本(Follower)。 跟随者副本包括同步副本和不同步副本,在發生首領副本切換的時候,隻有同步副本可以切換為首 領副本。

AR

分區中的所有副本統稱為AR(Assigned Repllicas)。 AR=ISR+OSR

ISR

所有與leader副本保持一定程度同步的副本(包括Leader)組成ISR(In-Sync Replicas),ISR集合 是AR集合中的一個子集。消息會先發送到leader副本,然後follower副本才能從leader副本中拉取消息 進行同步,同步期間内follower副本相對于leader副本而言會有一定程度的滞後。前面所說的“一定程度” 是指可以忍受的滞後範圍,這個範圍可以通過參數進行配置。

OSR

與leader副本同步滞後過多的副本(不包括leader)副本,組成OSR(Out-Sync Relipcas)。在正常 情況下,所有的follower副本都應該與leader副本保持一定程度的同步,即AR=ISR,OSR集合為空。

HW

HW是High Watermak的縮寫, 俗稱高水位,它表示了一個特定消息的偏移量(offset),消費之 隻能拉取到這個offset之前的消息。

LEO

LEO是Log End Offset的縮寫,它表示了目前日志檔案中下一條待寫入消息的offset。

Kafka:Kafka核心概念