Kafka 日志存储 — 文件目录及日志格式
日志存储机制是Kafka实现高吞吐量和持久化能力的关键。
1 文件目录布局

图 主题与日志文件的关系
Kafka中的消息持久化为日志文件。一个副本对应一个日志。日志文件在broker上是命名形式为<topic>-<partition>的文件夹。例如,主题par3第3分区在某个副本日志在broker上的文件夹名为par3-3。
为了防止Log过大,将其切分为多个LogSegment(日志分段),以便于消息的维护和清理。每个LogSegment对应磁盘的一个日志文件和两个索引文件,以及可能的其他文件(例如.txnindex 事务索引文件)。
向Log中追加消息是顺序写入的,只有最后一个LogSegment(activeSegment,当前活跃的日志分段)才能执行写入操作。
每个LogSegment 都有一个基准偏移量baseOffset,表示当前LogSegment中第一条消息的offset。日志及两个索引文件都是根据baseOffset命名的,名称固定为20为数字(64位的长整型数)。

图 某时刻par1主题的0分区所在的broker的目录下的文件
2 日志格式
Kafka的消息格式经历了3个版本:v0、v1、v2。
2.1 v0 版本

图 v0版本的消息结构
Offset:消息在分区中的偏移量。
message size: 消息的大小。
crc32: crc32 校验值,检验范围位magic至value之间。
magic: 消息格式版本号,值为0。
attributes:消息属性,低3位表示压缩类型,其余位保留。
key lenght: 消息的key长度。如果为-1,表示key=null。
key:可选
value lenght:实际消息体的长度,如果为-1,表示value=null。
value:消息体,可以为空,为空时可以用来表示墓碑(tombstone)消息。
Offset与message size 一起被称为日志头部(LOG_OVERHEAD)。一条或多条消息组成消息集,消息集是消息存储于磁盘及在网络上传输的基本形式,还是Kafka压缩的基本单位。
2.2 v1版本

图 v1版本的消息结构
v1 比v0 多添加了个字段timestamp,用于表示消息的时间戳。
attributes字段的第4位用于表示这个时间戳的类型,0 表示CreateTime 生产者创建消息时的时间戳、1 表示 LogAppendTime 消息添加到日志时的时间戳。默认值为0,可由broker端的log.message.timestamp.type 来配置。
2.3 v2 版本
与前面两个版本最大的不同是,消息字段大量采用了Varints(变长字段)。
2.3.1 Varints 变长字段
Varints 是使用一个或多个字节来序列化整数的一种方法。数值越小,其占用的字节数越少。每个字节都有一个位于最高位的msb位,除最后一个字节外,其余msb位都设置为1。表示其后的字节是否和当前字节一起来表示同一个整数。
Varints中采用的是小端字节序。
小端字节序:用于表示多字节数据的一种字节顺序的方式。低位在前,高位在后。即从右到左来阅读数字,而大端字节序,是高位在前,低位在后,从左到右来阅读数字。
例如int类型(4个字节,32位)的数字16。大端字节序表示为:00000000 00000000 00000000 00010000,小端字节序表示为00010000 00000000 00000000 00000000。
小端字节序在处理少字节格外高效。
2.3.2 v2版本格式

图 v2版本的消息结构
v2版本中消息集称为Record Batch 而不是先前的Message Set。在消息压缩的情形下,Record Batch Header 部分(从first offset 到records count)是不被压缩的,而records字段中的所有消息会被压缩。
| first offset | 当前RecordBatch 的起始位移。 |
| length | 从partition leaderepoch字段开始到末尾的长度。 |
| partition leader epoch | 分区leader纪元(版本号或更新次数) |
| attributes | 消息属性,低3位表示压缩格式,第4位表示时间戳类型;第5位表示此RecordBatch是否处于事务中,第6位表示是否是控制消息。 |
| first timestamp | RecordBatch中第一条Record的时间戳。 |
表 Record Batch 相关字段
| length | 消息总长度 |
| attributes | 弃用,以备未来的格式扩展。 |
| timestamp delta | 时间戳增量。 |
| offset delta | 位移增量 |
表 v2版本 Record 相关字段
2.3.3 消息压缩
Kafka实现的压缩方式是将多条消息一起进行压缩。在一般情况下,生产者发送的压缩数据在broker也是保持压缩状态进行存储,消费者从服务端获取的也是压缩的消息,消费者在处理消息之前才会解压消息。
当消息压缩时,将整个消息集进行压缩作为内层消息,内层消息整体作为外层的value。外层中的key为null。内层被压缩的消息,其offset从0开始。
相关文章:
Kafka 日志存储 — 文件目录及日志格式
日志存储机制是Kafka实现高吞吐量和持久化能力的关键。 1 文件目录布局 图 主题与日志文件的关系 Kafka中的消息持久化为日志文件。一个副本对应一个日志。日志文件在broker上是命名形式为<topic>-<partition>的文件夹。例如,主题par3第3分区在某个副…...
故障诊断 | BWO白鲸算法优化KELM故障诊断(Matlab)
目录 效果一览文章概述BWO白鲸算法优化KELM故障诊断一、引言1.1、研究背景及意义1.2、故障诊断技术的现状1.3、研究目的与内容二、KELM基本理论2.1、KELM模型简介2.2、核函数的选择2.3、KELM在故障诊断中的应用三、BWO白鲸优化算法3.1、BWO算法基本原理3.2、BWO算法的特点3.3、…...
一文读懂AI Agent 智能体
一、什么是智能体Agent? 在计算机科学和人工智能领域,智能体(Agent) 是一个抽象的概念,用于描述能够感知环境、执行行动并以此对环境产生影响的实体。智能体通常被设计成具有自主性和适应性,能够在不确定、…...
《 C++ 点滴漫谈: 二十二 》操作符炼金术:用C++ operator重塑代码美学
摘要 C 的 operator 关键字和操作符重载是语言的核心特性之一,使开发者能够扩展内置操作符以适应自定义类型,从而实现更高效、直观的代码表达。本文全面解析了 operator 关键字的基本概念、支持重载的操作符范围及其使用场景,详细介绍了操作…...
通信协议之多摩川编码器协议
前言 学习永无止境!本篇是通信协议之多摩川编码器协议,主要介绍RS485硬件层以及软件层帧格式。 注:本文章为学习笔记,部分图片与文字来源于网络/应用手册,如侵权请联系!谢谢! 一、多摩川协议概述…...
新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵
本博文内容导读📕🎉🔥 ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上,提供了强大的灵活性,能适应不同的应用需求。 ESP32中断主…...
4329 树的连边II
通过链式前向星来求树的直径 主要包括:链式前向星的初始化,遍历,使用 #include<bits/stdc.h> using namespace std; using lllong long; const int N1e59; int n,head[N],to[N<<1],nx[N<<1],cnt0; int ans0; int dp[N][2…...
Spring的Bean详解=Bean别名+作用范围+使用场景
目录 Bean的别名:id和name的地位等同 Bean的作用范围:scope单例与非单例 Bean的使用场景:什么时候交给容器?什么时候不交? Bean的别名实践(含代码) 如果看不懂下面的,例如不知道i…...
聊一聊如何适应AI时代
我的工作行业就不提了,处于AI的前沿阵地之一,AI的进步非常惊艳,虽然我对AI持有开放态度,但也恐惧,因为我的进步跟不上它迭代的速度。 AI能涉及的行业:辅助驾驶、医疗诊断、数据分析、文稿生成、工业控制...…...
dl学习笔记:(4)简单神经网络
(1)单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…...
电商项目高级篇08-springCache
电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…...
4.1 AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量
AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量 随着人工智能技术的不断进步,GPT系列大模型已经成为了自然语言处理领域的核心工具。无论是在文本生成、对话系统,还是内容创作等领域,GPT模型都展现出了强大的能力。然而,要高效、精确地使用这些模型,仍然需要一…...
Linux top命令cpu使用率计算底层原理
在Linux中,top命令通过读取内核提供的统计数据来计算CPU使用率。其底层原理可以概括为以下几步: 1. 读取 /proc/stat top命令主要从/proc/stat文件中获取CPU的统计信息。这个文件包含了每个CPU核心(或所有核心合计)的各种状态下的…...
vue知识点总结
vue2知识点总结 watch: watch 是 Vue 提供的一个选项,它允许你观察 Vue 实例上的数据变化。当观察的数据发生变化时,会执行相应的回调函数,这样你就可以对数据的变化做出响应,执行一些特定的操作。 export default {data() {re…...
[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()
目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget(一般情况下默认会自带) 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…...
llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型
说明 我需要在昇腾服务器上对Qwen2-72B大模型进行lora微调,改变其自我认知。 我的环境下是8张910B1卡。显存约512GB。 准备:安装llamafactory 请参考官方方法安装llamafactory:https://github.com/hiyouga/LLaMA-Factory 特别强调下&…...
C++,设计模式,【目录篇】
文章目录 1. 简介2. 设计模式的分类2.1 创建型模式(Creational Patterns):2.2 结构型模式(Structural Patterns):2.3 行为型模式(Behavioral Patterns): 3. 使用设计模式…...
《目标检测数据集下载地址》
一、引言 在计算机视觉的广袤领域中,目标检测宛如一颗璀璨的明星,占据着举足轻重的地位。它宛如赋予计算机一双锐利的 “眼睛”,使其能够精准识别图像或视频中的各类目标,并确定其位置,以边界框的形式清晰呈现。这项技…...
C 语言的void*到底是什么?
一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如,它可以指向一个整数(int)、一个浮点数(float)、一个字符(char)或者一个结构体等。在C语言中,当…...
Linux中的文件上传和下载
Linux中的文件上传和下载 一、连接 SFTP 在 SecureCRT 中,将鼠标移动到连接窗口的标题上,按鼠标右键,选择“连接 SFTP”标签,即可进入 SFTP 模式。 二、基本指令及用途 1. 显示当前目录 显示本地当前目录:lpwd 示例…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
