Kafka 的消息数据存储结构基于「主题 + 分区 + 副本 + 分段 + 索引」的结构。
Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响。
每个主题又可以分为一个或多个分区。
每个分区各自存在一个记录消息数据的日志文件。
然后每个分区又被划分成了多个 LogSegment,相当于一个巨型文件被平均分割为一些相对较小的文件,这样也便于消息的查找、维护和清理。
偏移量索引文件 .index 用于记录消息偏移量与物理地址之间的映射关系。
- 主题(Topic):
每个主题(Topic)是消息的逻辑分类,可以理解为一个消息队列。 - 分区(Partition):
每个主题可以被划分为多个分区(Partition),每个分区是一个有序的、不可变的消息序列。
分区的数量在创建主题时指定,可以在创建后调整。
每个分区对应一个日志文件,消息按顺序追加到日志文件的末尾。 - 副本(Replica):
每个分区可以有多个副本(Replica),副本分布在不同的Broker上,以实现数据的冗余和高可用性。
副本分为领导者(Leader)和跟随者(Follower),生产者和消费者只与领导者交互,跟随者从领导者同步数据 - 日志段(Log Segment):
每个分区的日志文件会被分割成多个日志段(Log Segment),每个日志段有一个固定的大小。
日志段的切换是基于时间和大小的,当达到设定的时间或大小限制时,会创建新的日志段。
这种设计有助于提高文件管理和垃圾回收的效率。 - 偏移量(Offset):
每条消息在分区中都有一个唯一的偏移量(Offset),用于标识消息的位置。
消费者通过维护偏移量来跟踪已经消费的消息,确保消息的顺序性和不重复消费。