Kafka-工作流程,文件存储机制,如何通过offset找到对应的消息

Kafka工作流程

在这里插入图片描述
Kafka 中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。

topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于多个 log 文件,该 log 文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该 log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

文件存储机制

在这里插入图片描述
由于生产者生产的消息会不断追加到 log 文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分段索引机制,

partition 在服务器上的表现形式就是一个一个的文件夹(命名规则:topic名称+分区序号),每个 partition 文件夹下面会有多组 segment(逻辑分组,并不是真实存在),每个 segment 对应三个文件 (.log文件、.index文件、.timeindex文件)

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

在这里插入图片描述
如上图,这个 partition 有三组 segment 文件,每个 log 文件的大小是一样的,但是存储的 message 数量是不一定相等的(每条的 message 大小不一致)。文件的命名是以该 segment 最小 offset 来命名的,如 000.index 存储offset为0~368795的消息,kafka就是利用分段+索引的方式来解决查找效率的问题。

Message结构
log 文件就是实际存储 message 的地方,在 producer 往 kafka 写入的也是一条一条的 message,消息主要包含消息体、消息大小、offset、压缩类型…等!主要是下面三个:
  1、 offset:offset是一个占8byte的有序id号,它可以唯一确定每条消息在parition内的位置。
  2、 消息大小:消息大小占用4byte,用于描述消息的大小。
  3、 消息体:消息体存放的是实际的消息数据(被压缩过),占用的空间根据具体的消息而不一样。

存储策略
  无论消息是否被消费,kafka都会保存所有的消息。那对于旧数据有什么删除策略?
  1、 基于时间,默认配置是168小时(7天)。
  2、 基于大小,默认配置是1073741824。

#server.properties

#segment文件的大小,默认为 1G
log.segment.bytes=1024*1024*1024
#滚动生成新的segment文件的最大时长
log.roll.hours=24*7
#segment文件保留的最大时长,超时将被删除
log.retention.hours=24*7

如何通过offset找到对应的消息?

index和log文件以当前segment的第一条消息的offset命名。下图为index文件和log文件的结构示意图。
在这里插入图片描述

扫描二维码关注公众号,回复: 11593181 查看本文章

1、 先找到 offset=3 的 message 所在的 segment文件(利用二分法查找),先判断.index文件名称offset是否小于3;
 若小于,则继续二分与下一个.inde文件名称offset比较;
 若大于,则返回上次小于3的.index文件,这里找到的就是在第一个segment文件。

2、找到的 segment 中的.index文件,用查找的offset 减去.index文件名的offset,也就是00000.index文件,我们要查找的offset为3的message在该.index文件内的索引为3(index采用稀疏存储的方式,它不会为每一条message都建立索引,而是每隔4k左右,建立一条索引,避免索引文件占用过多的空间。缺点是没有建立索引的offset不能一次定位到message的位置,需要做一次顺序扫描,但是扫描的范围很小)。

3、 根据找到的相对offset为3的索引,确定message存储的物理偏移地址为756。

4、 根据物理偏移地址,去.log文件找相应的Message

Kafka 的 Message 存储采用了分区,磁盘顺序读写,分段和稀疏索引等一些手段来达到高效性,在0.9版本之后,offset 已经直接维护在kafka集群的__consumer_offsets这个topic中。

猜你喜欢

转载自blog.csdn.net/qq_32727095/article/details/108012552