二、kafka的文件存储机制

简图:

 

producer 将数据写入kafka后,集群需要对数据进行保存。

kafka将数据保存在磁盘,kafka初始会单独开辟一块磁盘空间,顺序写入(效率比随机写入高)。

 

1、partition结构

partition在服务器上表现形式是一个个文件夹,生产者将生产的消息不断追加到log文件的末尾,为防止log文件过大导致数据定位效率低,kafka采取分片和索引的机制,将每个partition分为多个segment。

每组segment文件包含 .index文件、.log文件 、.timeindex文件。

log和index文件位于一个文件夹下,该文件夹命名规范为: topic名称+分区序号。例如:simon这topic有2个分区,对应的文件夹 simon-0 、simin-1

 

 log文件就是实际存储message的地方,二index和timeindex文件为索引文件,用于检索消息。

2、message 结构

log 文件就实际是存储 Message 的地方,我们在 Producer 往 Kafka 写入的也是一条一条的 Message。

消息主要包含:

  Offset:Offset 是一个占 8byte 的有序 id 号,它可以唯一确定每条消息在 Parition 内的位置;
  消息大小:消息大小占用 4byte,用于描述消息的大小;
  消息体:消息体存放的是实际的消息数据(被压缩过),占用的空间根据具体的消息而不一样。

 

index和log文件以当前segment的第一条消息的offset命名,下图为index文件和log文件的结构示意图:

 

例如:进入simon-0目录下查看

 3、存储策略

无论消息是否被消费,Kafka 都会保存所有的消息。那对于旧数据有什么删除策略呢?

  基于时间,默认配置是 168 小时(7 天);
  基于大小,默认配置是 1073741824。
需要注意的是,Kafka 读取特定消息的时间复杂度是 O(1),所以这里删除过期的文件并不会提高 Kafka 的性能。


原文:https://blog.51cto.com/u_56701/9656766

posted @ 2024-03-26 11:29  zmjc  阅读(84)  评论(0编辑  收藏  举报