1. 程式人生 > >kafka系列-入門篇之訊息和offset儲存

kafka系列-入門篇之訊息和offset儲存

前言

Kafka具有儲存功能,預設儲存資料時間為7天或者大小1G,也就是說kafka broker上的資料超7天或者1G,就會被清理掉。這些資料存放在broker伺服器上,以log檔案的形式存在。

準備工作

topic

我添加了一個topic名字為demo1。為了方便觀察,它只有一個分割槽,一個副本。

kafka-topics.sh --zookeeper localhost:2181/kafka1 --desc --topic demo1

這裡寫圖片描述

producer

通過producer推送了11條資料

kafka-console-producer.sh --broker-list localhost:9092
--topic demo1

這裡寫圖片描述

日誌

log的路徑配置在conf/server.properties配置檔案中,我的日誌路徑配置在log1資料夾下。log檔案的命名那一長串0,是這個日誌檔案的offset位置。當日志文件達到時間或者大小的上限時,就會生成下一個日誌檔案,命名的就是下一個offset位置了。

檢視日誌內容

log日誌檔案是二進位制檔案,無法通過文字檢視,但是可以通過kafka.tools.DumpLogSegments類的方法,可以檢視日誌的內容。

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./logs1/demo1-0
/00000000000000000000.log --print-data-log

這裡寫圖片描述
–print-data-log選項,可以顯示日誌檔案中每條訊息推送的內容
另外還有兩個檔案,index檔案存放的是topic的offset,timeindex是存放的是時間戳

日誌格式

日誌每一條訊息的格式如下,不算訊息長度,共有34位元組。因為沒有key,所以‘hello world’這一條訊息佔用了35個位元組,下一條訊息從position35開始。
offset: 4bytes
position: 4bytes
offset: 8 bytes
message length: 4 bytes
crc: 4 bytes
magic value: 1 byte
attributes: 1 byte
timestamp: 8 bytes (Only exists when magic value is greater than zero)
key length : 4 bytes
key: K bytes
value length: 4 bytes
value: V bytes

consumer

上面講完了訊息儲存,那麼consumer的offset是怎麼儲存的呢?consumer有兩種訊息方式,一種是存放在broker的日誌目錄中,另一種方式是存放在zookeeper中。兩種存放方式和你使用kafka-console-consumer命令使用的選項有關。如果使用的是bootstrap-server,那麼就存放在broker;如果使用的是–zookeeper那麼就存放在zookeeper。

broker儲存offset

broker存放offset是kafka從0.9版本開始,提供的新的消費方式。原因是zookeeper來存放,還是有許多弊端,不方便靈活控制,效率不高。

下面使用consumer命令,消費剛才推送的訊息,這裡我消費的是分割槽0中的訊息,offset從5開始。

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo1 --partition 0 --offset 5

這裡寫圖片描述

列印所有的消費組名稱

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

這裡寫圖片描述

檢視消費明細,可以看到,我已經訊息到第11條資料了。

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --desc --group console-consumer-33936

這裡寫圖片描述

group zookeeper

下面通過zookeeper的方式消費資料

kafka-console-consumer.sh --zookeeper localhost:2181/kafka1 --topic demo1 --from-beginning

這裡寫圖片描述

列印所有的消費組名稱

kafka-consumer-groups.sh --zookeeper localhost:2181/kafka1 --list

這裡寫圖片描述

檢視消費明細,可以看到,我已經訊息到第11條資料了。

kafka-consumer-groups.sh --zookeeper localhost:2181/kafka1 --desc --group console-consumer-69524

這裡寫圖片描述

當然,我們也可以通過zookeeper client來檢視consumer的offset
這裡寫圖片描述

總結

通過以上的步驟,可以檢視到訊息的推送到broker的日誌檔案,檢視訊息推送的內容、offset和時間等資訊。另外,可以我們也檢視到訊息端讀取訊息的offset位置。能夠更深入的瞭解kakfa的工作原理。