持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
前言
本文是我 Kafka 学习的第 6 篇文章,今天我学习到的内容是分区数据存储结构,数据格式。
文件目录布局
回归之前的内容,我们知道 Kafka 中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset)。
分区存储对应的是磁盘上的一个 Log 文件。不考虑多副本的情况,一个分区对应一个日志。为了防止 Log 过大,Kafka 又引入了日志分段(LogSegment)的概念,将 Log 切分为多个 LogSegment,相当于一个巨型文件被平均分配为多个相对较小的文件,这样也便于消息的维护和清理。
事实上,Log 和 LogSegment 也不是纯粹物理意义上的概念,Log 在物理上只以文件夹的形式存储,而每个 LogSegment 对应于磁盘上的一个日志文件和两个索引文件,以及可能的其他文件(比如以 .txnindex 为后缀的事务索引文件,.deleted、.cleaned、.swap 等临时文件等)。
Log 对应了一个命名形式为 <topic>-<partition> 的文件夹。
Log 的数据写入方式是顺序写入的。注意:只有最后一个 LogSegment 才能执行写入操作,在此之前所有的 LogSegment 都不能写入数据。
为了便于消息的检索,每个 LogSegment 中的日志文件(以 .log 为文件后缀)都有对应的两个索引文件:偏移量索引文件(以 .index 为文件后缀)和时间戳索引文件(以 .timeindex 为文件后缀)。每个 LogSegment 都有一个基准偏移量 baseOffset,用来表示当前 LogSegment 中第一条消息的 offset。
偏移量是一个 64 位的长整型数,日志文件和两个索引文件都是根据基准偏移量(baseOffset)命名的,名称固定为 20 位数字,没有达到的位数则用 0 填充。比如第一个 LogSegment 的基准偏移量为 0,对应的日志文件为 00000000000000000000.log。
最后用一张图来描述上面的目录文件结构,即为:
参考文档
- 《深入理解 Kafka:核心设计与实践原理》—— 朱忠华