【基础】Kafka -- 日志存储

news2024/12/24 3:12:54

Kafka -- 日志存储

  • 日志文件目录
  • 日志索引
    • 偏移量索引
    • 时间戳索引
  • 日志清理
    • 日志删除
      • 基于时间
      • 基于日志大小
      • 基于日志起始偏移量
    • 日志压缩

日志文件目录

Kafka 中的消息以主题为单位进行基本归类,而每个主题又可以划分为一个或者多个分区。在不考虑多副本的情况下,每个分区对应一个日志 Log。为防止日志过大,Kafka 又引入了日志分段 LogSegment 的概念,即将大的日志文件均分为多个较小的文件,便于消息的维护和清理。

Log 在物理上以文件夹的形式存在,而每个 LogSegment 对应于磁盘上的一个日志文件和两个索引文件,以及可能存在的其他功能文件,如下图所示:

在这里插入图片描述

向 Log 中追加消息是按顺序写入的,只有最后一个 LogSegment 才能执行写入操作,因此最新的一个 LogSegment 也称为 activeSegment。随着消息不断的写入,当 activeSegment 满足一定限制条件时,就会创建新的 activeSegment。LogSegment 的切分包含以下几个条件:

  • 当前 LogSegment 问价文件的大小超过了 broker 端参数log.segment.bytes配置的值,该参数默认 1GB;

  • 当前 LogSegment 中消息的最大时间戳与当前系统时间的时间戳的差值大于log.roll.hourslog.roll.ms的值(若同时配置则后者优先级高)。默认情况下只配置了后者,其值为 168(7 天);

  • 偏移量索引文件或时间戳索引文件的大小达到 broker 端参数log.index.size.max.bytes的值,该参数默认为 10 MB;

  • 新增消息的偏移量与当前 LogSegment 的偏移量之间的差值大于Integer.MAX_VALUE,即要追加消息的偏移量无法转换为相对偏移量;

为了便于消息的检索,每个 LogSegment 都对应着两个索引文件:偏移量索引文件(以.index为后缀)和时间戳索引文件(以.timeindex为后缀)。另外,每个 LogSegment 都有一个基准偏移量 baseOffset,用于表示当前 LogSegment 中第一条消息的 offset。偏移量是一个 64 位的长整型数,日志以及索引文件都是以基准偏移量命名的,名称长度固定为 20 位,不足的位数以 0 补充。查看 LogSegment 的内容如下所示:

在这里插入图片描述

日志索引

每个日志分段文件对应了两个索引文件,用于提高查找消息的效率:

  • 偏移量索引用于建立消息偏移量 offset 到物理地址之间的映射关系;

  • 时间戳索引根据指定的时间戳来查找对应的偏移量信息;

Kafka 中的索引以稀疏索引的方式来构造消息的索引,每当写入一定量的消息时,偏移量索引和时间戳索引则分别增加一个偏移量索引项和时间戳索引项。该值由 broker 端参数log.index.interval.bytes指定,默认为 4096,即 4KB。

偏移量索引

偏移量索引的格式如下:

relativeOffsetposition
4B4B

每个索引项占据 8 个字节,分为两部分:

  • relativeOffset:相对偏移量,表示消息当对于 baseOffset 的偏移量,占用 4 个字节。当前索引的文件名即 baseOffset;

  • position:物理地址,即消息在日志分段文件中对应的物理地址;

消息的绝对偏移量 offset 占用 8 个字节,此处采用占据 4 个字节的相对偏移量以减少索引文件占据的空间,relativeOffset = offset - baseOffset。

索引和日志的对应关系如下所示:

在这里插入图片描述

倘若存在下图所示的几个分段日志文件:

在这里插入图片描述

若要查找偏移量为 268 的消息:

  • 首先需要定位到 baseOffset 为 251 的日志分段。Kafka 的每一个日志对象中都采用了 ConcurrentSkipListMap (跳跃表)来存储各个日志分段,每个日志分段的 baseOffset 作为 key 用于快速查找。

  • 确定日志分段文件后再计算相对偏移量=268-251=17,利用二分查找快速定位到消息的 position。

  • 最后根据 position 定位到日志文件的相应位置查询目标消息。

时间戳索引

时间戳索引的格式如下:

timestamprelativeOffset
8B4B

每个索引项占据 12 个字节,分为两部分:

  • timestamp:当前日志分段的最大时间戳;

  • relativeOffset:时间戳所对应的消息的相对偏移量;

时间戳索引、偏移量索引与日志的对应关系如下所示:

在这里插入图片描述

若要查找目标时间戳为 1526384718288 开始的消息:

  • 首先需要依次对比日志分段中的最大时间戳与目标时间戳,直到找到最大时间戳不小于目标时间戳的日志分段文件;

  • 确定日志分段文件后利用二分法查找不大于目标时间戳的最大索引项,获取其相对偏移量;

  • 在偏移量索引文件中使用二分法查找不大于上一步查到的相对偏移量的最大索引项,获取物理位置 position;

  • 在步骤一的日志分段文件中,从上一步查询到的物理位置处开始查找不小于目标时间戳的消息;

日志清理

Kafka 的消息存储在磁盘当中,为控制磁盘占用空间的不断增加,其提供了两种日志清理策略:

  • 日志删除(Log Retention):按照一定的保留策略直接删除不符合条件的日志分段;

  • 日志压缩(Log Compaction):针对每个消息的 key 进行整合,对于 key 相同的不同 value 值,只保留最新的版本;

通过 broker 端参数log.cleanup.policy可以设置日志的清理策略,默认值为 “delete”,即采用删除策略。设置为 “compact” 即采用压缩策略。还可以设置为 “delete,compact” 以同时支持删除和压缩策略。注意,还需要将log.cleaner.enable设置为 true,默认为 true。

日志清理的细粒度可以控制到主题级别。

日志删除

Kafka 日志管理器中存在一个周期性检测和删除不符合保留条件的日志分段文件的任务,该任务的检测周期可以通过 broker 端参数log.retention.check.interval.ms来配置,默认值为 300000,即 5 分钟。

日志分段的保留策略有 3 种:基于时间、基于日志大小以及基于日志起始偏移量。

基于时间

在该策略中,日志删除任务会检查当前日志文件中是否存在保留时间超过所设定阈值 retentionMs 以寻找可删除的日志分段文件集合 deletableSegments。如下图:

在这里插入图片描述

其中,retentionMs 可以通过 broker 端参数log.retention.hourslog.retention.minutes以及log.retention.ms来配置,各参数优先级按顺序依次增高。Kafka 默认配置log.retention.hours为 168,即 7 天。

若全部的日志分段都已经过期,则首先会切分出一个新的活跃日志分段 activeSegment,然后再执行删除操作。删除时,首先将 Log 对象维护的日志分段跳跃表中移除待删除的日志分段,以保证不会有线程对这些日志分段执行读取操作。然后再将待删除的日志分段及其索引文件标记“.deleted”的后缀。最后交由一个延迟任务执行文件的删除,该任务的延迟执行时间由file.delete.delay.ms参数配置,默认值为 1 分钟。

基于日志大小

在该策略中,日志删除任务会检查当前日志分段文件的大小是否超过设定的阈值 retentionSize 以查找可删除的日志分段文件集合 deletableSegments。如下图:

在这里插入图片描述

其中,retentionMs 可以通过 broker 端参数log.retention.bytes来配置,默认值为 -1,表示无穷大。

查询到可删除的日志分段文件集合 deletableSegments 后,其删除过程与基于时间策略的删除过程相同。

基于日志起始偏移量

在该策略中,日志删除任务会检查当前日志分段文件的的下一日志起始分段文件的起始偏移量 baseOffset 是否小于等于 logStartOffset 以查找可删除的日志分段文件集合 deletableSegments。如下图:

在这里插入图片描述

其中,logStartOffset 的值可以通过 DeleteRecordsRequest 请求、日志的清理和截断等操作进行修改。

查询到可删除的日志分段文件集合 deletableSegments 后,其删除过程与基于时间策略的删除过程相同。

日志压缩

日志压缩是另外一种清理过时数据的方式,其对于具有相同 key 的不同 value,只保留 key 中最新的 value 值,如下图所示。若应用只关心 key 对应的最新 value 值,则可以开启日志压缩的功能。

在这里插入图片描述

在日志压缩前后,日志分段文件中的每条消息的偏移量与写入时的偏移量保持一致,只是日志压缩后的偏移量不再是连续的。

在 Kafka 日志的存放目录当中,存在着名为“cleaner-offset-checkpoint”的文件,该文件用于记录每个主题中的每个分区中已清理的偏移量。文件中记录的 cleaner checkpoint 可以将日志划分为两部分:已经清理过的 clean 部分和未清理过的 dirty 部分,如下图。

在这里插入图片描述

其中,dirty 部分的消息偏移量是逐一递增的,而 clean 部分的消息偏移量是不连续的。firstDirtyOffset 表示 dirty 部分的起始偏移量,firstUncleanableOffset 是 dirty 部分的终止偏移量。activeSegment 不会参与日志压缩的过程。

此外,Kafka 支持通过参数log.cleaner.min.compaction.lag.ms配置消息被压缩清理前的最小保留时间,默认为 0,即默认情况下 firstUncleanableOffset 等于 activeSegment 的 baseOffset。

注意:日志压缩是针对 key 的,故在使用时应注意每个消息的 key 不为 null。每个 broker 会启动log.cleaner.thread所配置个数的日志清理线程负责执行清理任务,这些线程会选择污浊率(=dirty日志大小/(clean日志大小+dirty日志大小))最大的日志文件进行清理。为防止日志的频繁清理,可以使用参数clean.cleanable.ratio来限定可进行清理操作的最小污浊率,默认值为 0.5。

在执行清理操作时,Kafka 日志清理线程会使用 SkimpyOffsetMap 对象来构建 key 与 offset 的映射关系表。清理过程需遍历日志文件两次:

  • 第一次遍历将每一个 key 和最后出现的 offset 保存在 SkimpyOffsetMap 对象中;

  • 第二次遍历判断每一个消息的 offset,将其与消息对应的 kay 在 SkimpyOffsetMap 中存储的值作比较,若前者大于后者则保留,反之进行清理;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe Photoshop 软件下载

Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。 时至今日,Adobe Photoshop 已经成为当今世界上最流行、应用最广泛的图像处理软件。不但设计专业的学生要系统的学习这个…

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完…

【iOS】AVPlayer 视频播放

视频播放器的类别 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是,AVAudioPlayer 只支持本地音频的播放,而 AVPlayer 既支持本地音频播放,也支持网络音频播放。 常用的视频播放…

python学习——【第八弹】

前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此python中的序列的学习就完成啦,这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就了解过函数:函数就是执行特定任何以完成特定功能的一段代…

【JWT】token jwt-跨域认证的问题、JWT 的原理、java JWT实用案例

本文是向大家介绍token JWT的相关学习,它能够实现登录认证功能的实现,了解它能够让我们对系统有更加全面系统的理解 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 一、跨域认证的问题 互联…

动态组件、keep-alive的使用及自定义指令

目录 1. 动态组件 2.如何实现动态组件渲染 3. 使用keep-alive保持状态 4. keep-alive对应的生命周期函数 5. keep-alive的include属性 自定义指令 1.什么是自定义指令 2. 自定义指令的分类 3. 私有自定义指令 4. update函数 5. 函数简写 全局自定义指令: …

媒体沟通会 | 云擎未来 智信天下:移动云大会终极预告

4月24日,“云擎未来 智信天下”2023移动云大会媒体沟通会在苏州举办,百余家主流新闻媒体参会。在媒体沟通会现场,中国移动云能力中心副总经理吴世俊致欢迎词,市场部副总经理吴炯详细介绍了移动云大会盛况,并透露在本届…

三问 ThreadLocal —— 有什么用 ? 使用时有什么潜在风险?原理 ?

最近想实现一些功能,求诸于网络之后,得到了使用 ThreadLocal 实现的方式,那么 ThreadLocal 到底是什么呢 ? 遂写此文,抽丝剥茧的来看一下这个 Java 并发类 。 最近,me 的 gpt 账号没了,所以不能…

【模板】Hexo Docker Nginx 个人博客服务器部署

上文:基于 Hexo 的 Github 博客搭建 注意:通过验证部署,确定无误。AI生成的部分有🤖图标。 🤖 TLDR By ChatGPT 本指南提供了在服务器上设置Git仓库、将本地Hexo页面推送到服务器仓库、在服务器上创建Nginx配置文件以…

数字信封例程不支持的bug,以及卸载安装配置Node.js

文章目录 前言一、运行错误:0308010C:数字信封例程:不支持二、卸载Node.js三、重新安装Node.js总结 前言 下载了若依项目,但是在前端项目运行打包都出现了bug。最后,卸载了Node.js,并重新安装了低版本的Node.js。 一、运行错误:0308010C:数字…

[算法前沿]--003-AGI通用人工智能模型对安全的影响和开源的大模型

文章目录 0.ChatGPT大模型带来的影响0.1 ChatGPT带来信息化革命性创新,目前尚不能处理专业知识但成长很快0.2 Chat GPT为网安行业带来新的创新方向,也将引领新一轮投融资热潮0.2.1 攻击方发起网络攻击的门槛降低0.2.2 防守方合理使用ChatGPT可大幅减少安…

组态王与PLC之间1主多从自组网无线通信

本方案是基于三菱专用协议下实现的1主多从自组网无线通信形式,主站为组态王,从站为三菱FX3U PLC和485BD扩展。采用日系PLC专用无线通讯终端DTD435MC-V96,作为实现无线通讯的硬件设备,来解决组态王与PLC之间的通讯问题。 一、方案…

百度AI模型“文心一言”新鲜体验

今天收到通知可以体验百度的AI模型“文心一言”,等了一个多月迫不及待的去体验了一把,以下是体验的相关记录。 1、简单介绍 通过文心一言官网链接https://yiyan.baidu.com/进入,看到如下界面: 在文心一言的自我介绍中&#xff0c…

seetaface6 GPU版本windows编译

目录 1. seetaface6概述2. 编译说明2.1 编译工具2.2 编译顺序 3. 编译OpenRoleZoo4. 编译SeetaAuthorize5. 编译TenniS6. 编译FaceTracker6 1. seetaface6概述 seetaface6源码以及模型文件github下载路径:https://github.com/SeetaFace6Open/index 由于项目性能需求…

华为为何要搞相对冷门的ERP?

大家都知道华为的研发实力很强,但几天前他们宣布研发出超大规模云原生的ERP时,还是有些吃惊。 20日,在东莞的一场“英雄强渡大渡河”表彰会上,华为抛出一个大多数公司都难以做到的成果:三年时间,数千人&am…

从零开始写ChatGLM大模型的微调代码

cursor 的下载及安装(免费版每月100次,升级pro 20刀/月) cursor是一款与openai合作的,使用gpt-4的一款编程工具,它可以让你通过gpt-4进行辅助编程,以此提高效率。 下载地址:https://www.curso…

CentOS系统安装Intel E810 25G网卡驱动

因特尔网卡驱动给的都是二进制包,需要编译环境。 首先去Intel下载最新的驱动 E810驱动下载:https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html?wapkwe810 里面有三个驱…

量子计算新进展!瑞典和芬兰率先研发芯片

(图片来源:网络) 芬兰和瑞典在北欧率先推出了独立的量子计算机项目,并在未来量子技术方面取得了可喜的新进展。 在瑞典,查尔姆斯理工大学 (Chalmers UoT) 获得了追加的900万欧元(约合6774万元人民币&#x…

风力发电系统的随机调度研究(matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【神经网络】tensorflow实验8--梯度下降法

1. 实验目的 ①掌握TensorFlow的可训练变量和自动求导机制 ②能够使用TensorFlow实现梯度下降法,求解一元和多元线性回归问题 2. 实验内容 下载波士顿房价数据集,使用线性回归模型实现对波士顿房价的预测,并以可视化的形式输出模型训练的过…