
圖片來自 Pexels
最終大家會掌握 Kafka 中最重要的概念,分別是 Broker、Producer、Consumer、Consumer Group、Topic、Partition、Replica、Leader、Follower,這是學(xué)會和理解 Kafka 的基礎(chǔ)和必備內(nèi)容。
定義
Kafka 是一個分布式的基于發(fā)布/訂閱模式的消息隊列(Message Queue),主要應(yīng)用與大數(shù)據(jù)實時處理領(lǐng)域。
消息隊列
Kafka 本質(zhì)上是一個 MQ(Message Queue),使用消息隊列的好處?(面試會問)
解耦:允許我們獨立的擴(kuò)展或修改隊列兩邊的處理過程。
可恢復(fù)性:即使一個處理消息的進(jìn)程掛掉,加入隊列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。
緩沖:有助于解決生產(chǎn)消息和消費(fèi)消息的處理速度不一致的情況。
靈活性&峰值處理能力:不會因為突發(fā)的超負(fù)荷的請求而完全崩潰,消息隊列能夠使關(guān)鍵組件頂住突發(fā)的訪問壓力。
異步通信:消息隊列允許用戶把消息放入隊列但不立即處理它。
發(fā)布/訂閱模式
一對多,生產(chǎn)者將消息發(fā)布到 Topic 中,有多個消費(fèi)者訂閱該主題,發(fā)布到 Topic 的消息會被所有訂閱者消費(fèi),被消費(fèi)的數(shù)據(jù)不會立即從 Topic 清除。
架構(gòu)
Kafka 存儲的消息來自任意多被稱為 Producer 生產(chǎn)者的進(jìn)程。數(shù)據(jù)從而可以被發(fā)布到不同的 Topic 主題下的不同 Partition 分區(qū)。
在一個分區(qū)內(nèi),這些消息被索引并連同時間戳存儲在一起。其它被稱為 Consumer 消費(fèi)者的進(jìn)程可以從分區(qū)訂閱消息。
Kafka 運(yùn)行在一個由一臺或多臺服務(wù)器組成的集群上,并且分區(qū)可以跨集群結(jié)點分布。
下面給出 Kafka 一些重要概念,讓大家對 Kafka 有個整體的認(rèn)識和感知,后面還會詳細(xì)的解析每一個概念的作用以及更深入的原理:
Producer: 消息生產(chǎn)者,向 Kafka Broker 發(fā)消息的客戶端。
Consumer:消息消費(fèi)者,從 Kafka Broker 取消息的客戶端。
Consumer Group:消費(fèi)者組(CG),消費(fèi)者組內(nèi)每個消費(fèi)者負(fù)責(zé)消費(fèi)不同分區(qū)的數(shù)據(jù),提高消費(fèi)能力。一個分區(qū)只能由組內(nèi)一個消費(fèi)者消費(fèi),消費(fèi)者組之間互不影響。所有的消費(fèi)者都屬于某個消費(fèi)者組,即消費(fèi)者組是邏輯上的一個訂閱者。
Broker:一臺 Kafka 機(jī)器就是一個 Broker。一個集群由多個 Broker 組成。一個 Broker 可以容納多個 Topic。
Topic:可以理解為一個隊列,Topic 將消息分類,生產(chǎn)者和消費(fèi)者面向的是同一個 Topic。
Partition:為了實現(xiàn)擴(kuò)展性,提高并發(fā)能力,一個非常大的 Topic 可以分布到多個 Broker (即服務(wù)器)上,一個 Topic 可以分為多個 Partition,每個 Partition 是一個 有序的隊列。
Replica:副本,為實現(xiàn)備份的功能,保證集群中的某個節(jié)點發(fā)生故障時,該節(jié)點上的 Partition 數(shù)據(jù)不丟失,且 Kafka 仍然能夠繼續(xù)工作,Kafka 提供了副本機(jī)制,一個 Topic 的每個分區(qū)都有若干個副本,一個 Leader 和若干個 Follower。
Leader:每個分區(qū)多個副本的“主”副本,生產(chǎn)者發(fā)送數(shù)據(jù)的對象,以及消費(fèi)者消費(fèi)數(shù)據(jù)的對象,都是 Leader。
Follower:每個分區(qū)多個副本的“從”副本,實時從 Leader 中同步數(shù)據(jù),保持和 Leader 數(shù)據(jù)的同步。Leader 發(fā)生故障時,某個 Follower 還會成為新的 Leader。
Offset:消費(fèi)者消費(fèi)的位置信息,監(jiān)控數(shù)據(jù)消費(fèi)到什么位置,當(dāng)消費(fèi)者掛掉再重新恢復(fù)的時候,可以從消費(fèi)位置繼續(xù)消費(fèi)。
Zookeeper:Kafka 集群能夠正常工作,需要依賴于 Zookeeper,Zookeeper 幫助 Kafka 存儲和管理集群信息。
工作流程
Kafka集群將 Record 流存儲在稱為 Topic 的類別中,每個記錄由一個鍵、一個值和一個時間戳組成。
Kafka 是一個分布式流平臺,這到底是什么意思?
發(fā)布和訂閱記錄流,類似于消息隊列或企業(yè)消息傳遞系統(tǒng)。
以容錯的持久方式存儲記錄流。
處理記錄流。
Kafka 中消息是以 Topic 進(jìn)行分類的,生產(chǎn)者生產(chǎn)消息,消費(fèi)者消費(fèi)消息,面向的都是同一個 Topic。
Topic 是邏輯上的概念,而 Partition 是物理上的概念,每個 Partition 對應(yīng)于一個 log 文件,該 log 文件中存儲的就是 Producer 生產(chǎn)的數(shù)據(jù)。
Producer 生產(chǎn)的數(shù)據(jù)會不斷追加到該 log 文件末端,且每條數(shù)據(jù)都有自己的 Offset。
消費(fèi)者組中的每個消費(fèi)者,都會實時記錄自己消費(fèi)到了哪個 Offset,以便出錯恢復(fù)時,從上次的位置繼續(xù)消費(fèi)。
存儲機(jī)制
由于生產(chǎn)者生產(chǎn)的消息會不斷追加到 log 文件末尾,為防止 log 文件過大導(dǎo)致數(shù)據(jù)定位效率低下,Kafka 采取了分片和索引機(jī)制。
它將每個 Partition 分為多個 Segment,每個 Segment 對應(yīng)兩個文件:“.index” 索引文件和 “.log” 數(shù)據(jù)文件。
這些文件位于同一文件下,該文件夾的命名規(guī)則為:topic 名-分區(qū)號。例如,first 這個 topic 有三分分區(qū),則其對應(yīng)的文件夾為 first-0,first-1,first-2。
# ls /root/data/kafka/first-0
00000000000000009014.index
00000000000000009014.log
00000000000000009014.timeindex
00000000000000009014.snapshot
leader-epoch-checkpoint
index 和 log 文件以當(dāng)前 Segment 的第一條消息的 Offset 命名。下圖為 index 文件和 log 文件的結(jié)構(gòu)示意圖:
(編輯:武林網(wǎng))
新聞熱點
疑難解答
圖片精選