1.offset:一种逻辑概念,类似C语言数组的索引号,每个offset记录了消息在具体分区的位置,offset对应物理上的地址,如offset=1对应的物理地址是2809,即相应分区的第2809个字节;

2.offset不是全局递增,只是在单个分区内单调递增;

3.message结构:offset+字节大小+具体消息

4..log和.index文件,.log文件记录了message,.index文件是.log文件的索引文件,它们在kafka配置项server.properties/log.dirs定义:

kafka使用索引查找message_二分查找

5.log和.index文件命名:形如00000000000000000000.index,00000000000000000000.log,index和log文件前缀的offset。

6.logSegment:创建几个分区,就会有几个目录,如创建test1,3分区的topic,那么kafka-logs目录下就会有三个子目录,如下所示:

kafka使用索引查找message_物理地址_02

分区由若干个logSegment组成,如00000000000000000000.index,00000000000000000000.log,00000000000000002307.index,00000000000000002307.log等。

7.根据offset查找具体message

(1)根据offset使用二分查找定位具体的索引文件(索引文件前缀有offset);

(2)在具体的索引文件使用二分查找,用offset找到相应的物理地址;

(3)到索引对应的log文件使用顺序扫描找到具体消息。

kafka使用索引查找message_kafka_03

在index文件中,左边第一列是offset,右边对应是物理地址,都是递增排序,log文件每条消息物理地址也是递增。