Kafka的Log存储原理再析

1、Partition中的分段存储Segment
一个partition被切割成多个相同大小的segment(这个是由log.segment.bytes 决定,控制每个segment的大小)

2、Partition中的Segment文件的数据结构
接下来看下segment的存储结构
segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件.
segment文件命名规则:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。
以及.timeindex文件。(0.8版本之前的kafka没有timeindex文件), 是kafka的具体时间日志
主要分成数据文件xxx.log,和索引文件xxx.index, 两个文件相对应的, 前缀相同。
在这里插入图片描述
以segment file文件为例,说明segment中的index与data file之间的对应关系
在这里插入图片描述
以索引文件中的3,497为例,依次在数据文件中表示第3个message(在全局partition表示第368772个message)、以及该消息的物理偏移地址为497。把index文件(index file)的(3,497)与log文件(data file) 的(Message368772,497)相对应 ,两个数字又分别代表消息的偏移量与对应的物理地址

为数据文件建立索引
在这里插入图片描述
索引文件中的offset与position的具体分布情况,请查阅本人的这篇博客
https://blog.csdn.net/weixin_38653290/article/details/84864708

3、segment data file 由许多Message组成,下面详细说明下Message的物理结构
在这里插入图片描述
重点记住:索引文件中的position 不是消息的offset, 而是message在segment中的物理位置。

4、在partition中如何通过offset查找到相应的message
例如读取offset=368776的message,需要通过下面2个步骤查找
第一步查找segment file (index file)
上述图2为例,其中00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1.同样,第三个文件00000000000000737337.index的起始偏移量为737338=737337 + 1,其他后续文件依次类推,以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。
当offset=368776时定位到00000000000000368769.index|log
第二步通过segment file(data file)查找message
通过第一步定位到segment file,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址(索引文件中的position),然后再通过00000000000000368769.log顺序查找直到offset=368776为止。
从上述可知这样做的优点,segment index file采取稀疏索引存储方式(重点理解),它减少索引文件大小,通过mmap (将一个文件或者其它对象映射进内存) 可以直接内存操作,稀疏索引为数据文件的每个对应message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

猜你喜欢

转载自blog.csdn.net/weixin_38653290/article/details/86621811