kafka log文件之存储原理和offset原理

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设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

4. log与offset
日志存储路径根据配置log.dirs ,日志文件通过 topic-partitionId分目录,再通过log.roll.hours 和log.segment.bytes来分文件,默认是超过7天,或者是1GB大小就分文件,在kafka的术语中,这被称为段(segment )。例如00000000000000033986.log,文件名就是offset,除了数据文件之外,相应的还有一个index文件,例如00000000000000033986.index。记录的是该数据文件的offset和对应的物理位置,正是有了这个index文件,才能对任一数据写入和查看拥有O(1)的复杂度,index文件的粒度可以通过参数log.index.interval.bytes来控制,默认是是每过4096字节记录一条index,太小意味着读取效率更高但是index文件会变大。基于这个特性,可以根据时间找到粗粒度的offset。(0.10.0.1版本之后增加记录了时间戳,粒度更细)

在这里插入图片描述


可以通过命令手动查看index文件

/srv/BigData/kafka/data1/kafka-logs这个路径就是log.dirs,topic-9是topic-partitionId

./kafka-run-class.sh kafka.tools.DumpLogSegments --files /srv/BigData/kafka/data1/kafka-logs/topic-9/00000000000000033986.index
在这里插入图片描述

在这里插入图片描述


比如:要查找绝对offset为7的Message:

1、用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。
2、打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。
3、打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值