kafka的日志存储

362 阅读23分钟

简述

Kafka ⽇志对象由多个⽇志段对象组成,⽽每个⽇志段对象会在磁盘上创建⼀组⽂件,包括消息⽇ 志⽂件(.log)、位移索引⽂件(.index)、时间戳索引⽂件(.timeindex)以及已中⽌(Aborted)事 务的索引⽂件(.txnindex)。当然,如果你没有使⽤ Kafka 事务,已中⽌事务的索引⽂件是不会被创建出来的。

消息日志文件

消息日志文件00000000000000000000.log 为20位数字代表的文件名

  • 单个条目组成:消息都具有固定的物理结构,包括:offset(8 Bytes)、消息 体的⼤⼩(4 Bytes)、crc32(4 Bytes)、magic(1 Byte)、attributes(1 Byte)、key length(4 Bytes)、key(K Bytes)、payload(N Bytes)等等字段,可以确定⼀条消息的⼤⼩, 即读取到哪⾥截⽌。
  • 大小:特别注意,网络上很多错误!!!.log文件大小不固定,设置参数log.segment.bytes只是达到阀值开启一个新的段,一个段是.index+.log组成
  • 命名规则:根据存储消息数进行,如上一个segment存储了2500条,下一个新生成segment文件名为00000000000000002501.log

index文件

index文件包含offset和Position,在kafka的日志中,**这个offset应该叫relativeOffset,相对偏移量。**kafka将基础偏移量也就是logsegment的名称作为key存在concurrentSkipListMap中,因此index中存储的是相对于这个baseOffset的偏移量

**特点:**稀疏存储,跳跃表结构(方便二分查找)

消息查找

1,根据index所在concurrentSkipListMap找到index文件(不大于当前offset的最大key值的index文件)

2,根据offset和baseOffset(文件名上那个数值)确认相对偏移量

3,根据相对偏移量找到不大于当前offset的最大offset的position

4,去.log文件寻址,向下顺序查找到和offset匹配的message