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