1kafka簡介
Kafka 是一個分布式的基于發(fā)布/訂閱模式的消息隊(duì)列(Message Queue),主要應(yīng)用與大數(shù)據(jù)實(shí)時處理領(lǐng)域。其主要設(shè)計(jì)目標(biāo)如下:
-
以時間復(fù)雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數(shù)據(jù)也能保證常數(shù)時間的訪問性能
-
高吞吐率。即使在非常廉價的機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸
-
支持Kafka Server間的消息分區(qū),及分布式消費(fèi),同時保證每個partition內(nèi)的消息順序傳輸,同時支持離線數(shù)據(jù)處理和實(shí)時數(shù)據(jù)處理
2為什么要用消息系統(tǒng)
Kafka 本質(zhì)上是一個 MQ(Message Queue),使用消息隊(duì)列的好處?
-
解耦:允許我們獨(dú)立修改隊(duì)列兩邊的處理過程而互不影響。
-
冗余:有些情況下,我們在處理數(shù)據(jù)的過程會失敗造成數(shù)據(jù)丟失。消息隊(duì)列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn), 確保你的數(shù)據(jù)被安全的保存直到你使用完畢
-
峰值處理能力:不會因?yàn)橥话l(fā)的流量請求導(dǎo)致系統(tǒng)崩潰,消息隊(duì)列能夠使服務(wù)頂住突發(fā)的訪問壓力, 有助于解決生產(chǎn)消息和消費(fèi)消息的處理速度不一致的情況
-
異步通信:消息隊(duì)列允許用戶把消息放入隊(duì)列但不立即處理它, 等待后續(xù)進(jìn)行消費(fèi)處理。
3kafka基礎(chǔ)知識
下面給出 Kafka 一些重要概念,讓大家對 Kafka 有個整體的認(rèn)識和感知
-
Producer:即消息生產(chǎn)者,向 Kafka Broker 發(fā)消息的客戶端。
-
Consumer:即消息消費(fèi)者,從 Kafka Broker 讀消息的客戶端。
-
Consumer Group:即消費(fèi)者組,消費(fèi)者組內(nèi)每個消費(fèi)者負(fù)責(zé)消費(fèi)不同分區(qū)的數(shù)據(jù),以提高消費(fèi)能力。一個分區(qū)只能由組內(nèi)一個消費(fèi)者消費(fèi),不同消費(fèi)者組之間互不影響。
-
Broker:一臺 Kafka 機(jī)器就是一個 Broker。一個集群是由多個 Broker 組成的且一個 Broker 可以容納多個 Topic。
-
Topic:可以簡單理解為隊(duì)列,Topic 將消息分類,生產(chǎn)者和消費(fèi)者面向的都是同一個 Topic。
-
Partition:為了實(shí)現(xiàn)Topic擴(kuò)展性,提高并發(fā)能力,一個非常大的 Topic 可以分布到多個 Broker 上,一個 Topic 可以分為多個 Partition 進(jìn)行存儲,每個 Partition 是一個有序的隊(duì)列。
-
Replica:即副本,為實(shí)現(xiàn)數(shù)據(jù)備份的功能,保證集群中的某個節(jié)點(diǎn)發(fā)生故障時,該節(jié)點(diǎn)上的 Partition 數(shù)據(jù)不丟失,且 Kafka 仍然能夠繼續(xù)工作,為此Kafka提供了副本機(jī)制,一個 Topic 的每個 Partition 都有若干個副本,一個 Leader 副本和若干個 Follower 副本。
-
Leader:即每個分區(qū)多個副本的主副本,生產(chǎn)者發(fā)送數(shù)據(jù)的對象,以及消費(fèi)者消費(fèi)數(shù)據(jù)的對象,都是 Leader。
-
Follower:即每個分區(qū)多個副本的從副本,會實(shí)時從 Leader 副本中同步數(shù)據(jù),并保持和 Leader 數(shù)據(jù)的同步。Leader 發(fā)生故障時,某個 Follower 還會被選舉并成為新的 Leader , 且不能跟 Leader 在同一個broker上, 防止崩潰數(shù)據(jù)可恢復(fù)。
-
Offset:消費(fèi)者消費(fèi)的位置信息,監(jiān)控?cái)?shù)據(jù)消費(fèi)到什么位置,當(dāng)消費(fèi)者掛掉再重新恢復(fù)的時候,可以從消費(fèi)位置繼續(xù)消費(fèi)。
-
ZooKeeper服務(wù):Kafka 集群能夠正常工作,需要依賴于 ZooKeeper,ZooKeeper 幫助 Kafka 存儲和管理集群元數(shù)據(jù)信息。在最新版本中, 已經(jīng)慢慢要脫離 ZooKeeper。
4kafka集群架構(gòu)
工作流程
在了解kafka集群之前, 我們先來了解下kafka的工作流程, Kafka集群會將消息流存儲在 Topic 的中,每條記錄會由一個Key、一個Value和一個時間戳組成。
Kafka 中消息是以 Topic 進(jìn)行分類的,生產(chǎn)者生產(chǎn)消息,消費(fèi)者消費(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)者,也都會實(shí)時記錄當(dāng)前自己消費(fèi)到了哪個 Offset,方便在崩潰恢復(fù)時,可以繼續(xù)從上次的 Offset 位置消費(fèi)。
存儲機(jī)制
此時 Producer 端生產(chǎn)的消息會不斷追加到 log 文件末尾,這樣文件就會越來越大, 為了防止 log 文件過大導(dǎo)致數(shù)據(jù)定位效率低下,那么Kafka 采取了分片和索引機(jī)制。它將每個 Partition 分為多個 Segment,每個 Segment 對應(yīng)4個文件:“.index” 索引文件, “.log” 數(shù)據(jù)文件,
“.snapshot” 快照文件,
“.timeindex” 時間索引文件。這些文件都位于同一文件夾下面,該文件夾的命名規(guī)則為:topic 名稱-分區(qū)號。例如, heartbeat心跳上報(bào)服務(wù) 這個 topic 有三個分區(qū),則其對應(yīng)的文件夾為 heartbeat-0,
heartbeat-1,
heartbeat-2這樣。
index, log, snapshot, timeindex 文件以當(dāng)前 Segment 的第一條消息的 Offset 命名。其中 “.index” 文件存儲大量的索引信息,“.log” 文件存儲大量的數(shù)據(jù),索引文件中的元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中 Message 的物理偏移量。
下圖為index 文件和 log 文件的結(jié)構(gòu)示意圖:
Replica - 副本
kafka中的 Partition 為了保證數(shù)據(jù)安全,每個 Partition 可以設(shè)置多個副本。此時我們對分區(qū)0,1,2分別設(shè)置3個副本(注:設(shè)置兩個副本是比較合適的)。而且每個副本都是有"角色"之分的,它們會選取一個副本作為 Leader 副本,而其他的作為 Follower 副本,我們的 Producer 端在發(fā)送數(shù)據(jù)的時候,只能發(fā)送到Leader Partition里面 ,然后Follower Partition會去Leader那自行同步數(shù)據(jù), Consumer 消費(fèi)數(shù)據(jù)的時候,也只能從 Leader 副本那去消費(fèi)數(shù)據(jù)的。
Controller
Kafka Controller,其實(shí)就是一個 Kafka 集群中一臺 Broker,它除了具有普通Broker 的消息發(fā)送、消費(fèi)、同步功能之外,還需承擔(dān)一些額外的工作。Kafka 使用公平競選的方式來確定 Controller ,最先在 ZooKeeper 成功創(chuàng)建臨時節(jié)點(diǎn) /controller 的Broker會成為 Controller ,一般而言,Kafka集群中第一臺啟動的 Broker 會成為Controller,并將自身 Broker 編號等信息寫入ZooKeeper臨時節(jié)點(diǎn)/controller。
Offset 的維護(hù)
Consumer 在消費(fèi)過程中可能會出現(xiàn)斷電宕機(jī)等故障,在 Consumer 恢復(fù)后,需要從故障前的 Offset 位置繼續(xù)消費(fèi)。所以 Consumer 需要實(shí)時記錄自己消費(fèi)到了哪個 Offset,以便故障恢復(fù)后繼續(xù)消費(fèi)。在 Kafka 0.9 版本之前,Consumer 默認(rèn)將 Offset 保存在 ZooKeeper 中,但是從 0.9 版本開始,Consumer 默認(rèn)將 Offset 保存在 Kafka 一個內(nèi)置的 Topic 中,該 Topic 為 __consumer_offsets, 以支持高并發(fā)的讀寫
。
4總結(jié)
上面和大家一起深入探討了 Kafka 的簡介, 基礎(chǔ)知識和集群架構(gòu),下一篇會從Kafka 三高(高性能, 高可用, 高并發(fā))方面來詳細(xì)闡述其巧妙的設(shè)計(jì)思想。 大家期待.....
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。