天天看點

【kafka】Kafka的基本介紹

目錄

介紹

kafka的好處

分布式的釋出與訂閱系統

kafka的主要應用場景

kafka的架構

kafka架構内部細節剖析

kafka主要元件

kafka的log存儲機制

kafka消息不丢失制

  • 介紹

kafka是最初由linkedin公司開發的,使用scala語言編寫,kafka是一個分布式,分區的,多副本的,多訂閱者的日志系統(分布式MQ系統),可以用于搜尋日志,監控日志,通路日志等

kafka對消息儲存時根據Topic進行歸類,發送消息者成為Producer,消息接受者成為Consumer,此外kafka叢集有多個kafka執行個體組成,每個執行個體(server)成為broker。無論是kafka叢集,還是producer和consumer都依賴于zookeeper來保證系統可用性叢集儲存一些meta資訊

Producer:資料發送者(生産者)

Consumer: 資料接收者(消費者)

broker:Kafka節點(存資料)

官網:http://kafka.apache.org/

  • 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的架構

【kafka】Kafka的基本介紹

生産者(Producer)API:

允許應用程式釋出記錄流至一個或者多個kafka的主題(topics)。

消費者(Consumer)API:

允許應用程式訂閱一個或者多個主題,并處理這些主題接收到的記錄流。

StreamsAPI:

允許應用程式充當流處理器(stream processor),從一個或者多個主題擷取輸入流,并生産一個輸出流到一個或者多個主題,能夠有效的變化輸入流為輸出流。

ConnectAPI:

允許建構和運作可重用的生産者或者消費者,能夠把kafka主題連接配接到現有的應用程式或資料系統。例如:一個連接配接到關系資料庫的連接配接器可能會擷取每個表的變化。

  • kafka架構内部細節剖析

【kafka】Kafka的基本介紹
【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目錄下,會建立一些檔案夾;名字是【主題名字-分區名】所組成的檔案夾。 在【主題名字-分區名】的目錄下,會有兩個檔案存在,如下所示:

【kafka】Kafka的基本介紹

在目錄下的檔案,會根據log日志的大小進行切分,.log檔案的大小為1G的時候,就會進行切分檔案;在kafka的設計中,将offset值會作為檔案名的一部分,後面的segment的名字是使用上一個segment檔案中最後一條資料的全局的編号。

精确找到資料的步驟:

1.使用折半/二分查找,先确定資料所在的segment.

2.使用确定的segment内的index檔案找到資料具體的位置

【kafka】Kafka的基本介紹

log CleanUp(删除或更新):

Kafka:用于臨時存儲一部分資料。會周期性删除比較老的資料。啟到緩沖的作用。

HDFS:用于資料的永久存儲

1.時間:預設存儲168小時(一周)

2.資料的大小:預設 -1 (不删除),可以自行設定。

3.合并機制:相同key的資料,隻保留最新的,最大版本資料。起到節省存儲空間的作用

  • kafka消息不丢失制

1.生産者通過ack 機制確定資料不丢失。

2.kafka叢集 通過資料副本保證資料不丢失。

3.消費者通過維護資料的offset 保證資料不丢失。

繼續閱讀