kafka-文件存储格式
kafka的消息和偏移量保存在文件里。保存在磁盘上的数据格式与从生产者发送过来或者发送给消费者的消息格式是一样的。因为使用了相同的消息格式进行磁盘存储和网络传输,kafka可以使用零复制技术给消费者发送消息,同时避免了对生产者已经压缩过的消息进行解压和再压缩。
除了键、值和偏移量外,消息里还包含了消息大小、校验和、消息格式版本号、压缩算法(Snappy、GZip或LZ4)和时间戳。时间戳可以是生产者发送消息的时间,也可以是消息到达broker的时间,这个是可配置的。
如果生产者发送的是压缩过的消息,那么同一个批次的消息会被压缩在一起,被当做“包装消息”进行发送。于是,broker就会收到一个这样的消息,然后再把它发送给消费者。消费者在解压这个消息之后,会看到整个批次的消息,它们都有自己的时间戳和偏移量。
如果在生产者端使用了压缩功能,那么发送的批次越大,就意味着在网络传输和磁盘存储方面会获得越好的压缩性能,同时意味着如果修改了消费者使用的消息格式,那么网络传输和磁盘存储的格式也要随之修改,而且broker要知道如何处理包含了两种消息格式的文件。
kafka附带了一个叫DumpLogSegment的工具,可以用它查看片段的内容。它可以显示每个消息的偏移量、校验和、魔术数字节、消息大小和压缩算法。运行该工具的方式如下
/kafka-run-class.sh kafka.tools.DumpLogSegments
如果使用--deep-iteration参数,可以显示被压缩到包装消息里的消息。
--files参数,用于指定想查看的分区片段
--print-data-log参数,指定打印详细内容
FengZhendeMacBook-Pro:bin FengZhen$ ./kafka-run-class.sh kafka.tools.DumpLogSegments --print-data-log --files /tmp/kafka-logs/test_partition1-0/00000000000000000000.log Dumping /tmp/kafka-logs/test_partition1-0/00000000000000000000.log Starting offset: 0 baseOffset: 0 lastOffset: 2 count: 3 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1593354030017 size: 124 magic: 2 compresscodec: NONE crc: 286907760 isvalid: true | offset: 0 CreateTime: 1593354030017 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana2 payload: 我是2 | offset: 1 CreateTime: 1593354030017 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana4 payload: 我是4 | offset: 2 CreateTime: 1593354030017 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana7 payload: 我是7 baseOffset: 3 lastOffset: 5 count: 3 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 124 CreateTime: 1593354171689 size: 124 magic: 2 compresscodec: NONE crc: 1670561994 isvalid: true | offset: 3 CreateTime: 1593354171688 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana2 payload: 我是2 | offset: 4 CreateTime: 1593354171689 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana4 payload: 我是4 | offset: 5 CreateTime: 1593354171689 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana7 payload: 我是7 baseOffset: 6 lastOffset: 8 count: 3 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 248 CreateTime: 1593354604994 size: 124 magic: 2 compresscodec: NONE crc: 4132128811 isvalid: true | offset: 6 CreateTime: 1593354604993 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana2 payload: 我是2 | offset: 7 CreateTime: 1593354604994 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana4 payload: 我是4 | offset: 8 CreateTime: 1593354604994 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana7 payload: 我是7 baseOffset: 9 lastOffset: 11 count: 3 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 372 CreateTime: 1593355312853 size: 124 magic: 2 compresscodec: NONE crc: 4126984011 isvalid: true | offset: 9 CreateTime: 1593355312852 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana2 payload: 我是2 | offset: 10 CreateTime: 1593355312853 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana4 payload: 我是4 | offset: 11 CreateTime: 1593355312853 keysize: 7 valuesize: 7 sequence: -1 headerKeys: [] key: Banana7 payload: 我是7 baseOffset: 12 lastOffset: 14 count: 3 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 496 CreateTime: 1593355487628 size: 1588 magic: 2 compresscodec: NONE crc: 2183807263 isvalid: true | offset: 12 CreateTime: 1593355487628 keysize: 7 valuesize: 493 sequence: -1 headerKeys: [] key: Banana2 payload: 【我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段】2 | offset: 13 CreateTime: 1593355487628 keysize: 7 valuesize: 493 sequence: -1 headerKeys: [] key: Banana4 payload: 【我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段】4 | offset: 14 CreateTime: 1593355487628 keysize: 7 valuesize: 493 sequence: -1 headerKeys: [] key: Banana7 payload: 【我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段我是测试分段】7