一、Producer
生産者建立消息。
該角色将消息釋出到Kafka的topic中。broker接收到生産者發送的消息後,broker将該消息追加到 目前用于追加資料的 segment 檔案中。
一般情況下,一個消息會被釋出到一個特定的主題上。
1. 預設情況下通過輪詢把消息均衡地分布到主題的所有分區上。
2. 在某些情況下,生産者會把消息直接寫到指定的分區。這通常是通過消息鍵和分區器來實作 的,分區器為鍵生成一個散列值,并将其映射到指定的分區上。這樣可以保證包含同一個鍵的 消息會被寫到同一個分區上。
3. 生産者也可以使用自定義的分區器,根據不同的業務規則将消息映射到分區。
二、Consumer
消費者讀取消息。
1. 消費者訂閱一個或多個主題,并按照消息生成的順序讀取它們。
2. 消費者通過檢查消息的偏移量來區分已經讀取過的消息。偏移量是另一種中繼資料,它是一個不 斷遞增的整數值,在建立消息時,Kafka 會把它添加到消息裡。在給定的分區裡,每個消息的 偏移量都是唯一的。消費者把每個分區最後讀取的消息偏移量儲存在Zookeeper 或Kafka 上,如果消費者關閉或重新開機,它的讀取狀态不會丢失。
3. 消費者是消費組的一部分。群組保證每個分區隻能被一個消費者使用。
4. 如果一個消費者失效,消費組裡的其他消費者可以接管失效消費者的工作,再平衡,分區重新 配置設定。
三、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 被稱為分區的首領。
四、Topic
每條釋出到Kafka叢集的消息都有一個類别,這個類别被稱為Topic。 實體上不同Topic的消息分開存儲。 主題就好比資料庫的表,尤其是分庫分表之後的邏輯表。
五、Partition
1. 主題可以被分為若幹個分區,一個分區就是一個送出日志。
2. 消息以追加的方式寫入分區,然後以先入先出的順序讀取。
3. 無法在整個主題範圍内保證消息的順序,但可以保證消息在單個分區内的順序。
4. Kafka 通過分區來實作資料備援和伸縮性。
5. 在需要嚴格保證消息的消費順序的場景下,需要将partition數目設為1。
六、Replicas
Kafka 使用主題來組織資料,每個主題被分為若幹個分區,每個分區有多個副本。那些副本被儲存 在broker 上,每個broker 可以儲存成百上千個屬于不同主題和分區的副本。 副本有以下兩種類型:
首領副本
每個分區都有一個首領副本。為了保證一緻性,所有生産者請求和消費者請求都會經過這個副本。
跟随者副本
首領以外的副本都是跟随者副本。跟随者副本不處理來自用戶端的請求,它們唯一的任務就是從首領那裡複制消息,保持與首領一緻的狀态。如果首領發生崩潰,其中的一個跟随者會被提升為新首領。
七、Offset
生産者Offset
消息寫入的時候,每一個分區都有一個offset,這個offset就是生産者的offset,同時也是這個分區 的最新最大的offset。 有些時候沒有指定某一個分區的offset,這個工作kafka幫我們完成。
消費者Offset
這是某一個分區的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。