Kafka 中的消息存储在磁盘上的目录布局是怎样的

作者:神秘网友 发布时间:2021-02-13 16:39:08

Kafka 中的消息存储在磁盘上的目录布局是怎样的

Kafka 中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset),具有4个分区的主题的逻辑结构见下图。

Kafka 中的消息存储在磁盘上的目录布局是怎样的

如果分区规则设置得合理,那么所有的消息可以均匀地分布到不同的分区中,这样就可以实现水平扩展。不考虑多副本的情况,一个分区对应一个日志(Log)。为了防止 Log 过大,Kafka 又引入了日志分段(LogSegment)的概念,将 Log 切分为多个 LogSegment,相当于一个巨型文件被平均分配为多个相对较小的文件,这样也便于消息的维护和清理。

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

Kafka 中的消息存储在磁盘上的目录布局是怎样的

接触过 Kafka 的老司机一般都知晓 Log 对应了一个命名形式为topic-partition的文件夹。举个例子,假设有一个名为“topic-log”的主题,此主题中具有4个分区,那么在实际物理存储上表现为“topic-log-0”、“topic-log-1”、“topic-log-2”、“topic-log-3”这4个文件夹:

Kafka 中的消息存储在磁盘上的目录布局是怎样的

向 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目录中的布局如下所示。

Kafka 中的消息存储在磁盘上的目录布局是怎样的

示例中第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 中的消息存储在磁盘上的目录布局是怎样的

消费者提交的位移是保存在 Kafka 内部的主题__consumer_offsets中的,初始情况下这个主题并不存在,当第一次有消费者消费消息时会自动创建这个主题。

Kafka 中的消息存储在磁盘上的目录布局是怎样的

在某一时刻,Kafka 中的文件目录布局如上图所示。每一个根目录都会包含最基本的4个检查点文件(xxx-checkpoint)和 meta.properties 文件。在创建主题的时候,如果当前 broker 中不止配置了一个根目录,那么会挑选分区数最少的那个根目录来完成本次创建任务。

- END -

Kafka 中的消息存储在磁盘上的目录布局是怎样的 相关文章

  1. LINUX中的limits.conf配置文件

    为何需要文件描述符 原因1 – 资源问题:节约内存资源。服务器上,每个打开的文件都需要消耗内存来管理。 原因2 – 安全问题:如果不限制的话,如果发生情况为,启动一个进程只是无限的创建和打开新的文件,会让服务器崩溃。 所以限制文件描述符的数量对于li

  2. Laravel session的使用

    laravel中的session默认存到文件中 session文件的目录: storage\framework\sessions 操作session的方法在laravel中有2种方案,有类来操作也有利用辅助函数来操作。 Session类来操作 辅助函数来操作 session() 设置session // 写入session// 方法一Session::

  3. python中的递归函数

    一、递归函数的特性 调用自身函数 有一个结束条件 凡是递归都可用循环解决 递归有时效率很底 二、递归函数的使用示例 1.斐波拉契数列的实现 1.1 递归版本 1 #递归版 2 def fibo2(n, first_num=0, second_num=1): 3 if n == 2: 4 return second_num 5 elif n

  4. 剑指 Offer 61. 扑克牌中的顺子 + 简单题 + 思维

    剑指 Offer 61. 扑克牌中的顺子 Offer_61 题目描述 java代码 package com.walegarrett.offer;/** * @Author WaleGarrett * @Date 2021/2/13 11:46 */import java.util.Arrays;/** * 题目详情:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连

  5. vue源码中的一些工具方法

    vue源码中的一些工具方法很实用,在开发的过程中可以用到,做一下记录 一个被冻结的空对象: const emptyObject = Object.freeze({}) 是否是空值、非空置、true、false function isUndef (v){ return v === undefined || v === null}function isDef (v){ ret

  6. MySQL基本操作

    删除操作 1. 删除单个表中的数据 DELETE FROM 表名 [WHERE 子句] [ORDER BY 子句] [LIMIT 子句] 2. 删除表中的全部数据 DELETE FROM 表名 修改操作 1. 修改字段默认值语法: alter table 表名 alter column 字段名 drop default; (若本身存在默认值,则先删

  7. 深入了解JS中的数据结构之链表(Linked-list)

    相关推荐:《javascript视频教程》 对于 JS 初学者,理解链表可能是一项比较困难的任务,因为 JS 没有提供内置的链表。 在像 JS 这样的高级语言中,我们需要从头开始实现此数据结构,如果你不熟悉此数据结构的工作方式,则实现部分会变得更加困难 ?。 在本文

  8. php中的六种密码加密方式分别是什么

    六种密码加密方式如下: 1、MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串。 raw_output -- 如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 这是一种不可逆加密

  9. 单一函数中的一系列Windows内核漏洞

    介紹 在分析Windows内核漏洞的过程中,我发现一个函数EtwpNotifyGuid存在5个以上的bug,分别是CVE-2020-1033、CVE-2020-1034、CVE-2021- 1662、CVE-2021-1682等。这些漏洞分别是CVE-2020-1033、CVE-2020-1034、CVE-2021- 1662、CVE-2021-1682等。在一个Windo

  10. spring(4)

    一、spring中的事务控制 1. Spring 事务控制我们要明确的 第一:JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计 业务层的事务处理解决方案。 第二:spring 框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词