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