Kafka文件存储机制
  yXrgnj2AQg6w 2023年11月02日 42 0

Kafka中消息是以topic进行分类的,生产者通过topic向Kafka broker发送消息,消费者通过topic读取数据。topic在物理层面又以partition为分组,一个topic可以分成若干个partition,partition还可以细分为segment(片、段),一个partition物理上由多个segment组成;

同一个topic下有多个不同的partition,每个partiton为一个目录,partition的名称规则为:topic名称+有序序号,第一个序号从0开始计,最大的序号为partition数量减1;

以segment为单位将partition细分。每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(段)数据文件中(每个segment 文件中消息数量不一定相等)这种特性也方便old segment的删除,即方便已被消费的消息的清理,提高磁盘的利用率。每个partition只需要支持顺序读写就行,segment的文件生命周期由服务端配置参数(log.segment.bytes、log.roll.{ms,hours}等若干参数)决定。

1.segment 文件

segment文件由两部分组成,分别为 .index、.log 文件,为segment索引文件和数据文件。这两个文件的命令规则为:

partition全局的第一个segment从0开始;

后续每个segment文件名为上一个segment文件最后一条消息的offset值;

数值大小为64位,20位数字字符长度,没有数字用0填充

log数据文件存储消息;

以 index 索引文件中的元数据[3, 348]为例,在.log数据文件表示第3个消息,即在全局partition中表示170410+3=170413个消息,该消息的物理偏移地址为348。

如何从partition中通过offset查找message?

例如:要读取offset=170418的消息,首先查找segment文件。

第一个文件为00000000000000000000.index;

第二个文件为00000000000000170410.index(起始偏移为170410+1=170411);

第三个文件为00000000000000239430.index(起始偏移为239430+1=239431);

offset=170418就落到了第二个文件之中。其他后续文件可以依次类推,以其实偏移量命名并排列这些文件,然后根据二分查找法就可以快速定位到具体文件位置。

其次根据00000000000000170410.index文件中的[8,1325]定位到00000000000000170410.log文件中的1325的位置进行读取。

要是读取offset=170418的消息,从00000000000000170410.log文件中的1325的位置进行读取。

怎么知道何时读完本条消息,否则就读到下一条消息的内容了。

这就需要知道到消息的物理结构了,消息都具有固定的物理结构,包括:offset(8 Bytes)、消息体的大小(4 Bytes)、crc32(4 Bytes)、magic(1 Byte)、attributes(1 Byte)、key length(4 Bytes)、key(K Bytes)、payload(N Bytes)等等字段,可以确定一条消息的大小,即读取到哪里截止。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: Kafka的核心概念 下一篇: kafka常用命令
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  9J4CFPeHjrny   2023年12月24日   30   0   0 字段Java字段Java
yXrgnj2AQg6w