kafka學習筆記1

2021-08-28 08:07:58 字數 2549 閱讀 1898

下面以乙個kafka集群中4個broker舉例,建立1個topic包含4個partition,2 replication;資料producer流動如圖所示:

當集群中新增2節點,partition增加到6個時分布情況如下:

producer在發布訊息到某個partition時,先通過zookeeper找到該partition的leader,然後無論該topic的replication factor為多少(也即該partition有多少個replica),producer只將該訊息傳送到該partition的leader。leader會將該訊息寫入其本地log。每個follower都從leader pull資料。這種方式上,follower儲存的資料順序與leader保持一致.

【push vs. pull】kafka採用pull

作為乙個messaging system,kafka遵循了傳統的方式,選擇由producer向broker push訊息並由consumer從broker pull訊息。一些logging-centric system,比如facebook的scribe和cloudera的flume,採用非常不同的push模式。事實上,push模式和pull模式各有優劣。

push模式很難適應消費速率不同的消費者,因為訊息傳送速率是由broker決定的。push模式的目標是盡可能以最快速度傳遞訊息,但是這樣很容易造成consumer來不及處理訊息,典型的表現就是拒絕服務以及網路擁塞。而pull模式則可以根據consumer的消費能力以適當的速率消費訊息。

【處理舊資料】

kafka提供兩種策略去刪除舊資料。一是基於時間,二是基於partition檔案大小。例如可以通過配置$kafka_home/config/server.properties,讓kafka刪除一周前的資料,也可通過配置讓kafka在partition檔案超過1gb時刪除舊資料,如下所示。

kafka partition和consumer數目關係

如果consumer比partition多,是浪費,因為kafka的設計是在乙個partition上是不允許併發的,所以consumer數不要大於partition數 。

如果consumer比partition少,乙個consumer會對應於多個partitions,這裡主要合理分配consumer數和partition數,否則會導致partition裡面的資料被取的不均勻 。最好partiton數目是consumer數目的整數倍,所以partition數目很重要,比如取24,就很容易設定consumer數目 。

如果consumer從多個partition讀到資料,不保證資料間的順序性,kafka只保證在乙個partition上資料是有序的,但多個partition,根據你讀的順序會有不同

增減consumer,broker,partition會導致rebalance,所以rebalance後consumer對應的partition會發生變化

kafka中可以將topic從物理上劃分成乙個或多個分割槽(partition),每個分割槽在物理上對應乙個資料夾,以」topicname_partitionindex」的命名方式命名,該資料夾下儲存這個分割槽的所有訊息(.log)和索引檔案(.index),這使得kafka的吞吐率可以水平擴充套件。

生產者在生產資料的時候,可以為每條訊息指定key,這樣訊息被傳送到broker時,會根據分割槽規則選擇被儲存到哪乙個分割槽中,如果分割槽規則設定的合理,那麼所有的訊息將會被均勻的分布到不同的分割槽中,這樣就實現了負載均衡和水平擴充套件。

【具體儲存】

topic在邏輯上可以被認為是乙個queue。每條消費都必須指定它的topic,可以簡單理解為必須指明把這條訊息放進哪個queue裡。為了使得kafka的吞吐率可以水平擴充套件,物理上把topic分成乙個或多個partition,每個partition在物理上對應乙個資料夾,該資料夾下儲存這個partition的所有訊息和索引檔案。

每個日誌檔案都是「log entries」序列,每乙個log entry包含乙個4位元組整型數(值為n),其後跟n個位元組的訊息體。每條訊息都有乙個當前partition下唯一的64字 節的offset,它指明了這條訊息的起始位置。磁碟上儲存的訊息格式如下:

message length : 4 bytes (value: 1+4+n)

「magic」 value : 1 byte

crc : 4 bytes

payload : n bytes

這個「log entries」並非由乙個檔案構成,而是分成多個segment,每個segment名為該segment第一條訊息的offset和「.kafka」組成。另外會有乙個索引檔案,它標明了每個segment下包含的log entry的offset範圍,如下圖所示。

學習筆記 Kafka

kafka kafka把資料往磁碟上寫,但是在磁碟上存它的讀寫速度比記憶體快,這個依賴於預讀和後寫功能,但是這個預讀和後寫必須是按照順序的方式,若沒有順序的方式優化的話,不存在什麼預讀和後寫。特點 訊息持久化 能落到磁碟 通過o 1 的磁碟資料結構提供資料的持久化 高吞吐量 分布式 擴充套件能力強 ...

Kafka學習筆記

1.1簡介 apache kafka 是分布式發布 訂閱訊息系統 訊息中介軟體 它最初由 linkedin 公司開發,之後成為 apache 專案的一部分。kafka 是一種快速 可擴充套件的 設計內在就是分布式的,分割槽的和可複製的提交日誌服務。apache kafka 與傳統訊息系統相比,有以下...

kafka學習筆記

1.1 kafka的特性 controller在zookeeper註冊watch zookeeper管理kakfabroker集群。所有的kafkabroker節點一起去zookeeper上註冊乙個臨時節點,只有乙個能成功,成功註冊的節點稱之為 kafkabrokercontroller,其餘的稱之...