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

总在说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 的数据文件夹下,分为三种类型的文件

你可能感兴趣的:(Kafka,职场,Message,Queue,kafka,数据结构,文件结构)