Kafka的消息格式和存储机制

存储机制

kafka的数据存储:
每个topic的分区对应一个文件夹,用来保存一个分区的数据。
这个文件夹下分为多个segment,将分区数据分为多个片段。每个segment有index和log两个文件。

[hadoop@hadoop000 topic_test-0]$ ls
00000000000000000099.index  00000000000000000099.log

index文件内容:

[hadoop@hadoop000 kafka_2.11-2.2.1]$ bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /home/hadoop/app/tmp/kafka-log/topic_test-0/00000000000000000099.index  --print-data-log
Dumping /home/hadoop/app/tmp/kafka-log/topic_test-0/00000000000000000099.index
offset: 99 position: 0

index文件由两列组成,offset和position。
position是相对于文件起始的地址,position为10,则在磁盘中的物理地址为这个文件的起始物理地址+position。
由于我的数据量不大,index文件只有一行offset和position。

log文件内容:

[hadoop@hadoop000 kafka_2.11-2.2.1]$ bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /home/hadoop/app/tmp/kafka-log/topic_test-0/00000000000000000099.log  --print-data-log
Dumping /home/hadoop/app/tmp/kafka-log/topic_test-0/00000000000000000099.log
Starting offset: 99
baseOffset: 99 lastOffset: 102 count: 4 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 
isTransactional: false isControl: false position: 0 CreateTime: 1611670759851 size: 137 magic: 2 compresscodec: NONE crc: 820456027 isvalid: true
| offset: 99 CreateTime: 1611670759849 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-1 payload: value-1
| offset: 100 CreateTime: 1611670759849 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-2 payload: value-2
| offset: 101 CreateTime: 1611670759851 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-5 payload: value-5
| offset: 102 CreateTime: 1611670759851 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-6 payload: value-6

查找offset为100的消息的步骤:

  • 在index文件中通过二分查找法来查找比它小并最接近的offset,得到offset=99的这行,得到position为0。
  • log文件中的每条数据也有position值,就能定位到log文件中position为0的数据,这个数据offset为99,然后再向后遍历一条,就能找到offset为100的数据。

消息格式

有个疑问:position是怎么来的呢?当然要知道每个消息所占的空间,才能去计算。
上面log文件的size为137,即为137个字节。所以下一个文件的position就从137开始。

消息的构成:Record Batch,其将多个消息(Record)打包存放到单个RecordBatch中,就是多个Record拥有一个header,而不是每个都拥有header。

137B的构成:

  • Record Batch Header部分共61B。
  • Record部分的总长度=1B+1B+1B+1B+5B+1B+7B+1B=18B
  • 编码为变长整型占1B
  • 61+(18+1)*4=137B

如果你看不懂,推荐个博客,写的很好:
一文看懂Kafka消息格式的演变.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页