在 Kafka 中,topic
、partition
、index
、log
和 timeindex
之间的关系可以通过理解它们的组织和功能来理清。以下是它们之间的关系和功能描述:
关系与功能
-
Topic:
- 定义:Topic 是消息的逻辑类别或管道,所有消息发布到 Kafka 都需要指定一个 topic。
- 功能:它是消息的分类单元,用于
分离不同类型的数据流
。
-
Partition:
- 定义:Partition 是 topic 的
物理分片
。每个 topic 可以有多个 partition,消息在 partition 之间分布。 - 功能:Partition 提供了并行处理的能力。每个 partition 是一个有序的消息队列,消息在其中按顺序排列。
- 定义:Partition 是 topic 的
-
Log:
- 定义:Log 是存储消息的
实际文件
。每个 partition 对应一个日志,由多个日志段文件(.log 文件)组成。 - 功能:Log 文件记录了消息数据。每条消息在 log 文件中都有一个唯一的偏移量(offset)。
- 定义:Log 是存储消息的
-
Index:
- 定义:Index 文件(.index 文件)是 log 文件的辅助文件,
记录消息偏移量到实际数据位置的映射
。 - 功能:通过 index 文件,可以快速定位特定偏移量的消息,而无需顺序扫描整个 log 文件。
- 定义:Index 文件(.index 文件)是 log 文件的辅助文件,
-
TimeIndex:
- 定义:TimeIndex 文件(.timeindex 文件)是 log 文件的辅助文件,记录
时间戳到消息偏移量的映射
。 - 功能:通过 timeindex 文件,可以根据时间戳快速查找消息位置,用于按时间查找消息。
- 定义:TimeIndex 文件(.timeindex 文件)是 log 文件的辅助文件,记录
结构关系示意图
Topic: my_topic
│
├── Partition 0
│ ├── Log File # 存储消息数据
│ ├── Index File # 记录偏移量到数据位置的映射
│ ├── TimeIndex File # 记录时间戳到偏移量的映射
│
├── Partition 1
│ ├── Log File
│ ├── Index File
│ ├── TimeIndex File
比如
Topic: my_topic
│
├── Partition 0
│ ├── 00000000000000000000.log # Log file storing messages
│ ├── 00000000000000000000.index # Index file for fast offset lookup
│ ├── 00000000000000000000.timeindex # Time index file for timestamp lookup
│ ├── 00000000000000000001.log
│ ├── 00000000000000000001.index
│ ├── 00000000000000000001.timeindex
│ └── ...
│
├── Partition 1
│ ├── 00000000000000000000.log
│ ├── 00000000000000000000.index
│ ├── 00000000000000000000.timeindex
│ ├── 00000000000000000001.log
│ ├── 00000000000000000001.index
│ ├── 00000000000000000001.timeindex
│ └── ...
│
└── ...
Kafka 生成新 log 文件的规则
-
基于大小:
- 配置参数:
log.segment.bytes
- 默认值:1 GB
- 规则:当一个 log 文件达到指定的字节数时,Kafka 会创建一个新的日志段文件。
- 配置参数:
-
基于时间:
- 配置参数:
log.roll.ms
或log.roll.hours
- 规则:当一个 log 文件存在的时间达到指定时长时,Kafka 会创建一个新的日志段文件。
- 配置参数:
<base-offset>.log
<base-offset>.index
<base-offset>.timeindex
- base-offset:该日志段文件的起始偏移量。
工作流程
- 消息写入:
- 生产者(Producer)将消息发送到指定的 topic 和 partition。
- 消息被追加到该 partition 的当前日志段文件(.log 文件)中,并分配一个偏移量。
- 同时,消息的偏移量信息被记录到 index 文件中,时间戳信息被记录到 timeindex 文件中。
- 消息读取:
- 消费者(Consumer)订阅 topic 并指定要读取的 partition。
- 消费者可以通过 index 文件快速查找到特定偏移量的消息。
- 如果按时间查找消息,消费者可以通过 timeindex 文件快速定位到指定时间的消息位置。
通过这样的设计,Kafka 实现了高效的消息存储、快速的消息查找和强大的并行处理能力。