kafka 文件存储机制

一、上一篇:kafka基础

二、kafka文件存储机制

从图中的架构我们可以看到,一类消息即topic分为了三个分区Partition,每一个Partition分区 由多个Segment,一个Segment存在一个.log文件,一个.index文件。

1)Topic :可以理解为一个队列,生产者和消费者面向同一个 topic; 
消息队列可能有很多消息,但是不是每一个消息消费者都要去获取,所以生产者生产消息后,给消息命名,
也就是主题名,消费者根据主题去拿自己的消息。我们可以把主题当成一个小的消息队列。
 
2)Partition:一个大的 topic 可以分布到多个 broker(即服务器)上,
 一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列

3)Segment:partition物理上由多个segment组成。 segment由2个文件组成,2个文件一一对应,成对出现,
后缀”.index”和“.log”分别表示为segment索引文件、数据文件.

4).log文件中存储的是生产者产生的数据,Producer 生产的数据会被不断追加到该
log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己
消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。

5).index 文件存放大量的元数据。

6)offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。
partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息

来给消息,给一个消息整一个编号,这就是序列号,可见序列号是递增的

三、如何快速定位消息

   假如一个分区里面只有一个.log 文件用来存储消息,生产者如果不断地在.log文件里面追加消息,log文件的是不是越来越大,我如何定位log文件里面的消息呢?

 后来引入的segment,当一个.log 文件到达1G的时候,会自动创建下一对.log和.index文件,也就是我们所说的segment。

segment:由一对.log和.index文件组成,每一个segment大小一致。

每个partion平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。

segment文件命名规则:partion全局的第一个segment从0(20个0)开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

由图介绍可知,segement文件命名是offset的值,且该值是不断递增的。

如何查找offset=368775这条消息

①二分查找法(适用于已经排好序的数据)快速定位该条数据存储第二个名为00000000000000368769.log文件中。

②在.index文件中去找第368777条数据所在的位置,即第8行。

  .index 中存放元数据,由一对的key-value组成,其中key是消息在.log文件中的编号,value表示该消息的物理偏移地址。比如“1,3,6,8……”,其中6代表.log数据文件从上到下第六个消息。key值在.index 文件中没有连续存放,为防止索引文件占用太多的内存空间,这样存在一个问题就是不能一次性的定位到消息的位置,且需要在.log日志文件顺序扫描消息所在的位置。如果为每一消息都建立一个索引,虽然一次性的扫描到文件的位置,这样就会建立太多的索引,占用内存。要么牺牲内存提高性能,要么性能差一些,减少内存的占用。

四、推荐博客:

https://www.cnblogs.com/jun1019/p/6256514.html

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

           

发布了240 篇原创文章 · 获赞 435 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/fjxcsdn/article/details/103073307