Kafka 中的 Topic 由一个或多个分区(Partition)组成,每个分区是一个有序的、不可变的消息队列。分区的数据在磁盘上的存储是通过以下方式实现的:
- 分区以文件夹形式保存:
- 每个 Kafka 主题的分区在磁盘上都有一个独立的目录,目录的命名通常是
<topic_name>-<partition_number>的形式。例如,orders-0表示orders主题的第 0 个分区。 - 这些目录通常位于 Kafka 日志目录中,该目录由 Kafka broker 的配置参数
log.dirs指定。
- 每个 Kafka 主题的分区在磁盘上都有一个独立的目录,目录的命名通常是
- 日志段文件(Log Segment Files):
- 每个分区的数据以一个或多个日志段文件的形式存储。这些日志段文件是顺序写入的,文件名通常包含开始偏移量,例如
00000000000000000000.log。 - 当一个日志段达到一定的大小限制(通常是通过配置参数
log.segment.bytes控制)或者一定的时间间隔后(如log.roll.hours配置),Kafka 就会创建一个新的日志段,并将新的消息追加到新的日志段中。这种机制称为日志的分段和滚动,通过这种方式,Kafka 实现了日志的循环复用,避免了单个日志文件过大导致的性能问题。
- 每个分区的数据以一个或多个日志段文件的形式存储。这些日志段文件是顺序写入的,文件名通常包含开始偏移量,例如
- 索引文件:
- 每个日志段文件会有对应的索引文件,通常包括偏移量索引(
.index)和时间戳索引(.timeindex),用于加速消息的查找。 - 索引文件帮助 Kafka 实现快速定位特定消息的位置,从而提高查找效率。
*.timeindex和 kafka 清理数据有着密切的关系,kafka 默认保留 7 天内的数据,对于超过 7 天的数据,会被清理掉,这里的清理逻辑主要根据 timeindex 时间索引文件里最大的时间来判断的,如果最大时间与当前时间差值超过 7 天,那么对应的数据段就会被清理掉。
- 每个日志段文件会有对应的索引文件,通常包括偏移量索引(
- 数据文件格式:
- 每条消息在日志段文件中是以二进制格式存储,包括消息的元数据(如偏移量、时间戳)和消息体。
- 顺序写入:
- Kafka 采用顺序写入的方式将消息写入日志段文件,这种方式非常高效,充分利用磁盘的顺序写能力。
- 日志压缩和清理:
- Kafka 支持基于保留时间或保留大小的日志清理策略,可以删除或压缩不再需要的旧数据。
- 使用日志清理(Log Compaction)可以让 Kafka 存储最新版本的记录,并删除旧版本,节约磁盘空间。