5 日志存储
5 日志存储
TIP
本小节主要介绍以下知识:
- 日志存储相关的知识点
本小节偏底层,看起来较为枯燥乏味,后续再针对性看下。
概述
我们知道 Kafka 中的消息是存储再磁盘上的,那么为什么要使用磁盘作为存储介质?具体消息的存储格式又是什么呢?怎么样能够快速检索到指定的消息?消息不可能无限制存储,那么清理规则又是什么呢?带着这些疑问,我们来一探究竟。
文件目录布局
Kafka 中的消息是以主题为基本单位进行归类的,各个主题以逻辑上是独立的。每个主题又可以分为一个或多个分区,分区的数量是在主题创建时指定的。一个分区对应一个日志(Log),为了防止日志过大,引入了日志分段(LogSegment)概念,切分成多个较小文件。Log 在物理上只以文件夹的形式存储,而每个 LogSegment 对应磁盘上的日志文件和两个索引文件,以及可能的其他文件。
注意以下要点:
- 向 Log 中追加消息时是顺序写入的,只有最后一个 LogSegment 才能执行写入操作。
- 消息的检索可以使用偏移量索引文件和时间戳索引文件。注意下基准偏移量 baseOffset 与 topic-log-* 目录文件夹的关系。
- 注意每个 LogSegment 中不只包含 “.log”、“.index”、“.timeindex” 这 3 种文件,还可能包含 “.deleted”、“.cleaned”、“.swap” 等临时文件,以及可能的 “.snapshot”、“.txnindex”、“leader-epoch-checkpoint” 等文件。
日志格式的演变
略。
v0 版本
略。
v1 版本
略。
消息压缩
略。
变长字段
略。
v2 版本
略。
日志索引
略。
偏移量索引
略。
时间戳索引
略。
日志清理
略。
日志删除
略。
日志压缩
略。
磁盘存储
略。
页缓存
略。
磁盘 I/O 流程
略。
零拷贝
略。
参考文献
- [深入理解 Kafka 核心设计与实践原理]