Kafka 的消息存储结构:索引文件与数据文件

本文详细介绍了Kafka的消息存储结构,包括索引文件和数据文件的组织方式。每个Partition对应一个文件夹,存储Segment File,由索引文件(Index File)和数据文件(Data File)组成。索引文件通过偏移量快速定位消息,数据文件存储实际消息内容。文章还探讨了稀疏索引的概念,解释了如何在减少索引文件大小的同时保持查找效率,并讨论了索引的密度和均匀性的重要性。
摘要由CSDN通过智能技术生成

总在说Kafka,Topic,Key,Value;Kafka client发送消息/消费消息; Kafka Server 会接收生产者的消息,那么 Kafka 接收到消息并刷到磁盘之后。消息文件是如何存储的呢?

Kafka 的消息存储结构

Kafka 有 Topic 和 Partition 两个概念,一个 Topic 可以有多个 Partition。在实际存储的时候,Topic + Partition 对应一个文件夹,这个文件夹对应的是这个 Partition 的数据。

举例,一个topic为kafka-topic-loongshawn,对应3个分区:

./kafka-topics.sh 
--describe --zookeeper 127.0.0.1:2181 --topic kafka-loongshawn-01
Topic:kafka-loongshawn-01    PartitionCount:3    ReplicationFactor:3 Configs:
    Topic: kafka-loongshawn-01   Partition: 0    Leader: 1   Replicas: 1,2,0 Isr: 1,2,0
    Topic: kafka-loongshawn-01   Partition: 1    Leader: 2   Replicas: 2,0,1 Isr: 2,1,0
    Topic: kafka-loongshawn-01   Partition: 2    Leader: 0   Replicas: 0,1,2 Isr: 1,2,0

那么,其数据文件的目录结构如下所示,3个分区对应3个文件夹,文件夹命名topic-分区序号

# 分区目录文件
drwxr-x--- 2 root root 4096 Jul 26 19:35 kafka-loongshawn-01-0
drwxr-x--- 2 root root 4096 Jul 24 20:15 kafka-loongshawn-01-1
drwxr-x--- 2 root root 4096 Jul 24 20:15 kafka-loongshawn-01-2

在 Kafka 的数据文件目录下,一个 Partition 对应一个唯一的文件夹。如果有 4 个 Topic,每个 Topic 有 5 个 Partition,那么一共会有 4 * 5 = 20 个文件夹。以此类推。

而在文件夹下,Kafka 消息是采用 Segment File 的存储方式进行存储的。即每个分区文件夹下拆分为N个小文件,共同存储改分区中的所有消息。

Segment File 的大概意思是:将大文件拆分成小文件来存储,这样一个大文件就变成了一段一段(Segment 段)。这样的好处是 IO 加载速度快,不会有很长的 IO 加载时间。Kafka 的消息存储就采用了这种方式。

# 分区目录中的日志数据文件和日志索引文件
-rw-r----- 1 root root 512K Jul 24 19:51 00000000000000000000.index
-rw-r----- 1 root root 1.0G Jul 24 19:51 00000000000000000000.log
-rw-r----- 1 root root 768K Jul 24 19:51 00000000000000000000.timeindex
-rw-r----- 1 root root 512K Jul 24 20:03 00000000000022372103.index
-rw-r----- 1 root root 1.0G Jul 24 20:03 00000000000022372103.log
-rw-r----- 1 root root 768K Jul 24 20:03 00000000000022372103.timeindex
-rw-r----- 1 root root 512K Jul 24 20:15 00000000000044744987.index
-rw-r----- 1 root root 1.0G Jul 24 20:15 00000000000044744987.log
-rw-r----- 1 root root 767K Jul 24 20:15 00000000000044744987.timeindex
-rw-r----- 1 root root  10M Jul 24 20:21 00000000000067117761.index
-rw-r----- 1 root root 511M Jul 24 20:21 00000000000067117761.log
-rw-r----- 1 root root  10M Jul 24 20:21 00000000000067117761.timeindex

如上所示,在一个文件夹下的数据会根据 Kafka 的配置拆分成多个小文件。拆分规则可以根据文件大小拆分,也可以根据消息条数拆分,这个是 Kafka 的一个配置,这里不细说。

在 Kafka 的数据文件夹下,分为三种类型的文件:索引文件(I

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值