目錄
-
介紹
kafka是最初由linkedin公司開發的,使用scala語言編寫,kafka是一個分佈式,分區的,多副本的,多訂閱者的日誌系統(分佈式MQ系統),可以用於搜索日誌,監控日誌,訪問日誌等
kafka對消息保存時根據Topic進行歸類,發送消息者成爲Producer,消息接受者成爲Consumer,此外kafka集羣有多個kafka實例組成,每個實例(server)成爲broker。無論是kafka集羣,還是producer和consumer都依賴於zookeeper來保證系統可用性集羣保存一些meta信息
Producer:數據發送者(生產者)
Consumer: 數據接收者(消費者)
broker:Kafka節點(存數據)
-
kafka的好處
可靠性:分佈式的,分區,複製和容錯。
可擴展性:kafka消息傳遞系統輕鬆縮放,無需停機。
耐用性:kafka使用分佈式提交日誌,這意味着消息會儘可能快速的保存在磁盤上,因此它是持久的。
性能:kafka對於發佈和定於消息都具有高吞吐量。即使存儲了許多TB的消息,他也爆出穩定的性能。
kafka非常快:保證零停機和零數據丟失。
-
分佈式的發佈與訂閱系統
apache kafka是一個分佈式發佈-訂閱消息系統和一個強大的隊列,可以處理大量的數據,並使能夠將消息從一個端點傳遞到另一個端點,kafka適合離線和在線消息消費。kafka消息保留在磁盤上,並在集羣內複製以防止數據丟失。kafka構建在zookeeper同步服務之上。它與apache和spark非常好的集成,應用於實時流式數據分析。
-
kafka的主要應用場景
指標分析:
kafka通常用於操作監控數據。這設計聚合來自分佈式應用程序的統計信息,以產生操作的數據集中反饋
日誌聚合解決方法:
kafka可用於跨組織從多個服務器收集日誌,並使他們以標準的合適提供給多個服務器。
流式處理:
流式處理框架(spark,storm,flink)中主題中讀取數據,對齊進行處理,並將處理後的數據寫入新的主題,供用戶和應用程序使用,kafka的強耐久性在流處理的上下文中也非常的有用。數據實時打入kafka,實時計算框架(spark,storm,flink)實時在kafka中消費數據
-
kafka的架構
生產者(Producer)API:
允許應用程序發佈記錄流至一個或者多個kafka的主題(topics)。
消費者(Consumer)API:
允許應用程序訂閱一個或者多個主題,並處理這些主題接收到的記錄流。
StreamsAPI:
允許應用程序充當流處理器(stream processor),從一個或者多個主題獲取輸入流,並生產一個輸出流到一個或者多個主題,能夠有效的變化輸入流爲輸出流。
ConnectAPI:
允許構建和運行可重用的生產者或者消費者,能夠把kafka主題連接到現有的應用程序或數據系統。例如:一個連接到關係數據庫的連接器可能會獲取每個表的變化。
-
kafka架構內部細節剖析
kafka支持消息持久化,消費端爲拉模型,主動來拉取數據,消費狀態和訂閱關係有客戶端負責維護,消息消費完後,不會立即刪除,會保留歷史消息。因此支持多訂閱時,消息只會存儲一份就可以了。
Broker:kafka集羣中包含一個或者多個服務實例,這種服務實例被稱爲Broker
Topic:每條發佈到kafka集羣的消息都必須有一個類別,這個類別就叫做Topic
Partition:Partition是一個物理上的概念,每個Topic包含一個或者多個Partition
Producer:負責發佈消息到kafka的Broker中。
Consumer:消息消費者,向kafka的broker中讀取消息的客戶端
Consumer Group:每一個Consumer屬於一個特定的Consumer Group(可以爲每個Consumer指定 groupName)
segment:一個partition當中存在多個segment文件段,每個segment分爲兩部分,.log文件和.index文件,其中.index文件是索引文件,主要用於快速查詢.log文件當中數據的偏移量位置
.log:存放數據文件
.index:存放.log文件的索引數據
-
kafka主要組件
生產者(producer):
producer主要是用於生產消息,是kafka當中的消息生產者,生產的消息通過topic進行歸類,保存到kafka的broker裏面去
主題(topic):
1.kafka將消息以topic爲單位進行歸類
2.topic特指kafka處理的消息源(feeds of messages)的不同分類
3.topic是一種分類或者發佈的一些列記錄的名義上的名字。kafka主題始終是支持多用戶訂閱的;也就是說,一 個主題可以有零個,一個或者多個消費者訂閱寫入的數據
4.在kafka集羣中,可以有無數的主題
5.生產者和消費者消費數據一般以主題爲單位。更細粒度可以到分區級別
分區(partition):
kafka當中,topic是消息的歸類,一個topic可以有多個分區,每個分區保存部分topic的數據,所有的partition當中的數據全部合併起來,就是一個topic當中的所有的數據,
一個broker服務下,是否可以創建多,broker數與分區數沒有關係; 在kafka中,每一個分區會有一個編號:編號從0開始
每一個分區的數據是有序的,多個分區之間是無序的,Partition數量決定了每個Consumer group中併發消費者的最大數量
副本(Replicas):
1.副本的數量小於等於broker的數量
2.每個分區都有各自的主副本和從副本,主副本叫做leader,從副本叫做follower
3.follower通過拉的方式從leader同步數據
4.消費者和生產者都是從leader讀寫數據,不與follower交互,副本只用於提高讀取數據和寫入數據時的可靠性
5.lsr表示當前可用的副本
segment:
一個partition當中由多個segment文件組成,每個segment文件包含兩部分,一個是.log文件,另外一個是.index文件,其中.log文件包含了我們發送的數據存儲,.index文件記錄的是我們.log文件的數據索引值,以便於我們加快數據的查詢速度
索引文件(.index)與數據文件(.log)的關係:
既然它們是一一對應成對出現,必然有關係。索引文件中元數據指向對應數據文件中message的物理偏移地址,第一數字表示第幾條數據,第二個數字表示數據的偏移量
比如索引文件中3,497代表:數據文件中的第三個message,它的偏移地址爲497。再來看數據文件中,Message 368772表示:在全局partiton中是第368772個message。
segment index file採取稀疏索引存儲方式,不存儲所有數據的索引,只存儲一部分,它減少索引文件大小,通過map可以直接內存操作,稀疏索引爲數據文件的每個對應message設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來需要消耗更多的時間。
kafka當中的partition的offset:
任何發佈到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置稱爲offset(偏移量)
offset是一個long類型數字,它唯一標識了一條消息,消費者通過(offset,partition,topic)跟蹤記錄
kafka分區與消費組的關係:
1.消費組由一個或者多個消費者組成,同一個組中的消費者對於同一條消息只消費一次。
2.某一個主題下的分區數,對於消費組來說,應該小於等於該主題下的分區數。
3.任何時候分區中的一條數據只能被一個消費組中的一個消費任務讀取
4.分區數越多,同一時間可以有越多的消費者來進行消費,消費數據的速度就會越快,提高消費的性能
Partition = 消費任務的併發度=剛剛好,每個任務讀取一個partition數據
Partition > 消費任務的併發度=有部分消費任務讀取多個分區的數據
Partition < 消費任務的併發度=有部分消費任務空閒
消費者(consumer):
consumer是kafka當中的消費者,主要用於消費kafka當中的數據,任何一個消費者都必定需要屬於某一個消費組當中,任意時刻,一個分區當中的數據,只能被kafka當中同一個消費組下面的一個線程消費
-
kafka的log存儲機制
kafka中log日誌目錄及組成
kafka在我們指定的log.dir目錄下,會創建一些文件夾;名字是【主題名字-分區名】所組成的文件夾。 在【主題名字-分區名】的目錄下,會有兩個文件存在,如下所示:
在目錄下的文件,會根據log日誌的大小進行切分,.log文件的大小爲1G的時候,就會進行切分文件;在kafka的設計中,將offset值會作爲文件名的一部分,後面的segment的名字是使用上一個segment文件中最後一條數據的全局的編號。
精確找到數據的步驟:
1.使用折半/二分查找,先確定數據所在的segment.
2.使用確定的segment內的index文件找到數據具體的位置
log CleanUp(刪除或更新):
Kafka:用於臨時存儲一部分數據。會週期性刪除比較老的數據。啓到緩衝的作用。
HDFS:用於數據的永久存儲
1.時間:默認存儲168小時(一週)
2.數據的大小:默認 -1 (不刪除),可以自行設置。
3.合併機制:相同key的數據,只保留最新的,最大版本數據。起到節省存儲空間的作用
-
kafka消息不丟失制
1.生產者通過ack 機制確保數據不丟失。
2.kafka集羣 通過數據副本保證數據不丟失。
3.消費者通過維護數據的offset 保證數據不丟失。