Kafka是大型架构的必备中间件,下面我重点来详解Kafka文件存储原理@mikechen
Kafka文件存储
Apache Kafka 是一个分布式流处理平台,以高吞吐、低延迟和高可靠性著称。
Kafka其文件存储机制是实现的核心,Kafka 的存储系统设计围绕分布式、高性能和持久化存储展开。
其核心目标是高效地存储和读取海量消息,同时保证数据的高可用性和一致性。
Kafka文件存储原理
Kafka 的存储结构,可以概括为以下几个层次:
Topic
Kafka 中的逻辑概念,代表一类消息的集合。
Topic 是消息的逻辑容器,用于组织、和分类具有相同主题的消息流。
例如:可以有名为 “orders” 的 Topic 来存储订单信息,或者名为 “logs” 的 Topic 来存储应用程序日志。
Topic: user-events
在文件系统层面,一个 Topic 本身并不直接对应任何文件或目录,它更像是一个命名空间。
生产者将消息发送到 Topic,消费者从 Topic 订阅消息。
Partition
Topic 的物理分片,每个 Topic 被划分为一个或多个 Partition。
Partition 是 Kafka 并行处理、和分布式存储的基础。
在文件系统层面,Topic 的每个 Partition 对应 Broker 上的一个目录。
目录的命名通常遵循一定的规则,例如 <topic_name>-<partition_id>
。
/kafka-logs/user-events-0/ /kafka-logs/user-events-1/ /kafka-logs/user-events-2/
每个 Partition 实际上对应一个 有序的日志文件序列。
不同 Partition 的消息是相互独立的,顺序只在 Partition 内保证。
Segment
在 Kafka 中,Segment 是消息数据持久化到磁盘的最小文件单位。
Kafka 并不将所有消息写入一个巨大的文件,而是将每个 Partition 的日志,按大小、或时间切分为多个 Segment 文件。
如下图所示:
Segment是顺序追加的日志文件,默认大小约1GB。
每个Segment包含数据文件(.log
)和对应的索引文件(.index
和.timeindex
)。
Topic: user-events ├── Partition 0 │ ├── 00000000000000000000.log │ ├── 00000000000000000000.index │ ├── 00000000000000000000.timeindex
文件名称(示例) | 说明 |
---|---|
00000000000000000000.log |
实际消息日志记录(Record) |
00000000000000000000.index |
offset 到物理地址的索引 |
00000000000000000000.timeindex |
时间戳到 offset 的索引 |
通过将 Topic 划分为 Partition,再将 Partition 的数据存储到多个 Segment 文件中,Kafka 实现了高吞吐量和良好的可管理性。