分析过程分为以下3个步骤:

  1. topic中partition存储分布
  2. partiton中segment文件存储结构
  3. 在partition中如何通过offset查找message

一.topic中partition存储分布

在Kafka文件存储中,同一个topic下有多个不同partition每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始序号最大值为partitions数量减1

二.partiton中segment文件存储结构

在每个partition中有可以分为多个segment file。当生产者往partition中存储数据时,内存中存不下了,就会往segment file里面存储。kafka默认每个segment file的大小是500M,在存储数据时,会先生成一个segment file,当这个segment file到500M之后,再生成第二个segment file 以此类推。每个segment file对应两个文件,分别是以.log结尾的数据文件和以.index结尾的索引文件。在服务器上,每个partition是一个文件夹,每个segment是一个文件。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据。注:消息总量和消息数量是俩个概念

kafka数据保存到hdfs kafka的文件储存机制_kafka数据保存到hdfs


kafka数据保存到hdfs kafka的文件储存机制_偏移量_02

每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。(什么时候创建,什么时候删除)

kafka数据保存到hdfs kafka的文件储存机制_数据文件_03

每个segment file也有自己的命名规则,每个名字有20个字符,不够用0填充。每个名字从0开始命名,下一个segment file文件的名字就是,上一个segment file中最后一条消息的索引值。在.index文件中,存储的是key-value格式的,key代表在.log中按顺序开始第条消息,value代表该消息的物理位置偏移。但是在.index中不是对每条消息都做记录,它是每隔一些消息记录一次,避免占用太多内存。即使消息不在index记录中,在已有的记录中查找,范围也大大缩小了。

索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

kafka数据保存到hdfs kafka的文件储存机制_元数据_04


6,1407:当前log文件中的第几条信息,存放在磁盘上的那个地方

上述图中索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址

其中以索引文件中元数据6,1407为例,依次在数据文件中表示第6个message(在全局partiton表示第368775个message偏移量)、以及该消息的物理偏移地址为1407。

偏移量:在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message

三.在partition中如何通过offset查找message

例如读取offset=368776的message,需要通过下面2个步骤查找。

第一步查找segment file 上述图2为例,其中00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1.同样,第三个文件00000000000000737337.index的起始偏移量为737338=737337 + 1,其他后续文件依次类推,以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。 当offset=368776时定位到00000000000000368769.index|log

第二步通过segment file查找message 通过第一步定位到segment file,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址,然后再通过00000000000000368769.log顺序查找直到offset=368776为止。

kafka数据保存到hdfs kafka的文件储存机制_kafka数据保存到hdfs_05


从上述图可知这样做的优点,segment index file采取稀疏索引存储方式,它减少索引文件大小,通过mmap可以直接内存操作,稀疏索引为数据文件的每个对应message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

可以参考 :https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html