乐趣区

关于后端:Kafka-中的消息存储在磁盘上的目录布局是怎样的

Kafka 中的音讯是以主题为根本单位进行归类的,各个主题在逻辑上互相独立。每个主题又能够分为一个或多个分区,分区的数量能够在主题创立的时候指定,也能够在之后批改。每条音讯在发送的时候会依据分区规定被追加到指定的分区中,分区中的每条音讯都会被调配一个惟一的序列号,也就是通常所说的偏移量(offset),具备 4 个分区的主题的逻辑构造见下图。

如果分区规定设置得正当,那么所有的音讯能够平均地散布到不同的分区中,这样就能够实现程度扩大。不思考多正本的状况,一个分区对应一个日志(Log)。为了避免 Log 过大,Kafka 又引入了日志分段(LogSegment)的概念,将 Log 切分为多个 LogSegment,相当于一个巨型文件被平均分配为多个绝对较小的文件,这样也便于音讯的保护和清理。

事实上,Log 和 LogSegment 也不是纯正物理意义上的概念,Log 在物理上只以文件夹的模式存储,而每个 LogSegment 对应于磁盘上的一个日志文件和两个索引文件,以及可能的其余文件(比方以“.txnindex”为后缀的事务索引文件)。下图描述了主题、分区、正本、Log 以及 LogSegment 之间的关系。

image

接触过 Kafka 的老司机个别都通晓 Log 对应了一个命名模式为 <topic>-<partition> 的文件夹。举个例子,假如有一个名为“topic-log”的主题,此主题中具备 4 个分区,那么在理论物理存储上体现为“topic-log-0”、“topic-log-1”、“topic-log-2”、“topic-log-3”这 4 个文件夹:

向 Log 中追加音讯时是程序写入的,只有最初一个 LogSegment 能力执行写入操作,在此之前所有的 LogSegment 都不能写入数据。为了不便形容,咱们将最初一个 LogSegment 称为“activeSegment”,即示意以后沉闷的日志分段。随着音讯的一直写入,当 activeSegment 满足肯定的条件时,就须要创立新的 activeSegment,之后追加的音讯将写入新的 activeSegment。

为了便于音讯的检索,每个 LogSegment 中的日志文件(以“.log”为文件后缀)都有对应的两个索引文件:偏移量索引文件(以“.index”为文件后缀)和工夫戳索引文件(以“.timeindex”为文件后缀)。每个 LogSegment 都有一个基准偏移量 baseOffset,用来示意以后 LogSegment 中第一条音讯的 offset。偏移量是一个 64 位的长整型数,日志文件和两个索引文件都是依据基准偏移量(baseOffset)命名的,名称固定为 20 位数字,没有达到的位数则用 0 填充。比方第一个 LogSegment 的基准偏移量为 0,对应的日志文件为 00000000000000000000.log。

举例说明,向主题 topic-log 中发送一定量的音讯,某一时刻 topic-log- 0 目录中的布局如下所示。

示例中第 2 个 LogSegment 对应的基准位移是 133,也阐明了该 LogSegment 中的第一条音讯的偏移量为 133,同时能够反映出第一个 LogSegment 中共有 133 条音讯(偏移量从 0 至 132 的音讯)。

留神每个 LogSegment 中不只蕴含“.log”、“.index”、“.timeindex”这 3 种文件,还可能蕴含“.deleted”、“.cleaned”、“.swap”等临时文件,以及可能的“.snapshot”、“.txnindex”、“leader-epoch-checkpoint”等文件。

从更加宏观的视角上看,Kafka 中的文件不只下面提及的这些文件,比方还有一些检查点文件,当一个 Kafka 服务第一次启动的时候,默认的根目录下就会创立以下 5 个文件:

消费者提交的位移是保留在 Kafka 外部的主题__consumer_offsets 中的,初始状况下这个主题并不存在,当第一次有消费者生产音讯时会主动创立这个主题。

在某一时刻,Kafka 中的文件目录布局如上图所示。每一个根目录都会蕴含最根本的 4 个检查点文件(xxx-checkpoint)和 meta.properties 文件。在创立主题的时候,如果以后 broker 中不止配置了一个根目录,那么会筛选分区数起码的那个根目录来实现本次创立工作。

退出移动版