Kafka消息和offset存储

不羁的心 提交于 2019-12-16 17:32:37

前言

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的工作原理。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!