1. 程式人生 > 實用技巧 >Kafka核心概念

Kafka核心概念

Broker

一臺kafka伺服器就是一個broker。一個叢集由多個broker組成。

Kafka叢集包含一個或多個伺服器,這種伺服器被稱為broker。broker端不維護資料的消費狀態,提升了效能。直接使用磁碟進行儲存,線性讀寫,速度快:避免了資料在JVM記憶體和系統記憶體之間的複製,減少耗效能的建立物件和垃圾回收。

Topic

每條釋出到Kafka叢集的訊息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的訊息分開儲存,邏輯上一個Topic的訊息雖然保存於一個或多個broker上但使用者只需指定訊息的Topic即可生產或消費資料而不必關心資料存於何處)

Topic 就是資料主題,可以理解為訊息的類別,所有的訊息按照訊息的類別進行存放,主題只是邏輯上的概念,就是訊息屬於哪個Topic.

kafka建議根據業務系統將不同的資料存放在不同的topic中!Kafka中的Topics總是多訂閱者模式,一個topic可以擁有一個或者多個消費者來訂閱它的資料。一個大的Topic可以分散式儲存在多個kafka broker中!Topic可以類比為資料庫中的庫!

Partition分割槽

分割槽是訊息的物理上的概念,比如說這個訊息在磁碟的哪裡存放著.

分割槽就是我們可以將一個Topic劃分為多個區(Partition),比如說我有一個主題是 Hello,Hello可以分為三個區,這個時候在你Kafka 例項(Broker)的磁碟上會生成三個目錄,這個目錄的命名是按 “主題-分割槽名字” 的.比如說 “Hello-1” 和“Hello-2” , 這個目錄就是分割槽目錄, 你的資料就在這個分割槽目錄裡面產生一個檔案.

此外通過分割槽還可以讓一個topic被多個consumer進行消費!以達到並行處理!分割槽可以類比為資料庫中的表!
kafka只保證按一個partition中的順序將訊息發給consumer,不保證一個topic的整體(多個partition間)的順序。

Offset

簡單說就是每一個訊息的唯一id,有序不可變.

資料會按照時間順序被不斷第追加到分割槽的一個結構化的commit log中!每個分割槽中儲存的記錄都是有序的,且順序不可變!
這個順序是通過一個稱之為offset的id來唯一標識!因此也可以認為offset是有序且不可變的!
在每一個消費者端,會唯一儲存的元資料是offset(偏移量),即消費在log中的位置.偏移量由消費者所控制。通常在讀取記錄後,消費者會以線性的方式增加偏移量,但是實際上,由於這個位置由消費者控制,所以消費者可以採用任何順序來消費記錄。例如,一個消費者可以重置到一箇舊的偏移量,從而重新處理過去的資料;也可以跳過最近的記錄,從"現在"開始消費。

這些細節說明Kafka 消費者是非常廉價的—消費者的增加和減少,對叢集或者其他消費者沒有多大的影響。比如,你可以使用命令列工具,對一些topic內容執行 tail操作,並不會影響已存在的消費者消費資料。
在這裡插入圖片描述

訊息在寫到目錄的時候會 生成一個 int型別的id號, 這個id號就是 Offset , 後寫的訊息也會有Offset,是唯一遞增的.

在這裡插入圖片描述

持久化

Kafka的資料都會存到磁碟的,一旦消費者消費了資料,Kafka也不會被刪除,但是你可以設定保留策略

舉個例子, 如果保留策略設定為2天,一條記錄釋出後兩天內,可以隨時被消費,兩天過後這條記錄會被清除並釋放磁碟空間。

Kafka的效能和資料大小無關,假如說你磁碟存了50T的資料和存了100T的資料的效能是沒關係的,所以長時間儲存資料沒有什麼問題。

副本機制

我們資料是存到Partiton(分割槽)裡面的,Partition在磁碟的體現就是目錄,Kafka 可以設定每個主題的副本,設定之後,一個Partition(目錄)會存在多個副本,

假設三個副本,是在三個Broker(Kafka伺服器)裡面,每個Broker裡面存一份副本.

這個時候我向Partition進行讀寫操作的時候, 三個伺服器都有資料,我到底是讀哪個機器的資料?這個時候三個副本里面就會有角色劃分了.
三個副本里面會自動選舉出一個伺服器作為Leader,其餘都是Follwers, Leader必須有一個,Follwers你有零個也行(相當於我副本數量為1),
不管讀寫都是由Leader來負責, 處理一切對 partition (分割槽)的讀寫請求,而follwers只需被動的同步leader上的資料來保證資料是一致的.

當leader宕機了,followers 中的一臺伺服器會自動成為新的 leader。通過這種機制,既可以保證資料有多個副本,也實現了一個高可用的機制.

基於安全考慮,每個分割槽的Leader和follower一般會錯開在在不同的broker(相當於負載均衡)

Producer

訊息生產者,就是向kafka broker發訊息的客戶端。生產者負責將記錄分配到topic的指定 partition(分割槽)中

Consumer

訊息消費者,向kafka broker取訊息的客戶端。每個消費者都要維護自己讀取資料的offset。

低版本0.9之前將offset儲存在Zookeeper中,0.9及之後儲存在Kafka的“__consumer_offsets”主題中。兩者區別就是存到Zookeeper裡面的話需要使用Zookeeper客戶端查詢,如果是存到Kafka的話,你就需要用消費者消費主體來獲取最新的Offset記錄.

Consumer Group

一個消費者組可以同時訂閱多個topic主題, 一旦一個組訂閱了多個主題, 假如說這個消費者組裡面有兩個消費者執行緒,比如說C1和C2, 這C1和C2是可以消費多個分割槽的.
比如,我當前訂閱了兩個主題,topicA和topicB, topicA有兩個分割槽,topicB有三個分割槽,我消費者組裡面只有一個消費者執行緒C1,C1就負責消費topicA和topicB裡面的所有的分割槽.