Kafka索引机制

数据文件的分段和索引

kafka解决查询效率的手段之一是将数据文件分段存储,可以配置每一个文件的大小。每一个端段单独放在一个.log的文件中,数据文件命名是20个字符的长度,以每一个分段文件开始的最下offset来命名,其他位置用0填充。最初始的文件是00000000000000000000.log命名的,比如下一个log中的第一条消息的offset是18987,则该log文件的命名是00000000000000018987.log

其中每一个log文件的大小默认是1GB,每生成一个log文件就会对应产生一个offsetIndex文件,是和log文件的命名相同的。这样在进行消息检索的时候可以快速利用二分的方法进行查找,定位到某一个分段文件中。

 

Partition在服务器上的表现形式就是一个一个的文件夹,每个partition的文件夹下面会有多组segment文件,每组segment文件又包含.index文件、.log文件、.timeindex文件(早期版本中没有)三个文件, log文件就实际是存储message的地方,而index和timeindex文件为索引文件,用于检索消息。

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

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

### Kafka 索引机制Kafka中,为了提高消息检索效率并减少磁盘占用,采用了稀疏索引的设计[^2]。具体而言,每个分区(Partition)下的日志文件被分割成多个段(Segment)。每一段不仅包含实际的消息数据,还维护了两种类型的索引文件:偏移量索引文件和时间戳索引文件。 #### 偏移量索引文件 偏移量索引文件记录了一部分特定位置处的绝对偏移量及其对应的物理地址。由于不是每一个消息都建立索引条目,因此被称为“稀疏”。这种设计使得即使有大量的历史数据也不会造成过多的内存消耗或I/O开销。当消费者请求某个具体的偏移量时,系统会先利用这些预存的位置快速定位到最接近目标但不超过它的那一点,再从此处线性扫描直至找到确切的目标消息[^1]。 #### 时间戳索引文件 除了基于偏移量外,Kafka也允许按照事件发生的时间来访问消息。为此,在相同的原则下创建了时间戳索引文件,它同样遵循稀疏原则只保存某些时刻对应的信息。这有助于实现诸如按时间段查询等功能需求。 #### 相对偏移量的作用与计算方法 相对偏移量指的是相对于当前段内第一条记录的实际偏移值。引入这一概念主要是考虑到随着新消息不断追加至末尾,全局唯一性的绝对偏移可能会变得非常大而难以管理;相比之下,局部范围内的相对编号则更加紧凑易控。每当开启一个新的segment时,其内部所有entry都会重新计数从0开始累加形成各自的relative offset[^4]。 ```python def calculate_relative_offset(global_offset, segment_start_offset): """ 计算给定全局偏移量在全球范围内所指向的具体message在其所属segment中的相对位置 参数: global_offset (int): 要转换为相对偏移量的全局偏移量. segment_start_offset (int): 当前segment起始的全局偏移量. 返回: int: 给定global_offset对应的相对偏移量. """ relative_offset = global_offset - segment_start_offset return relative_offset ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值