Kafka 日志存储 — 日志清理

Kafka 提供两种日志清理策略:日志清理(Log Delete)与日志压缩(Log Compaction)。

1 日志清理

通过broker端参数log.cleanup.policy来设置日志清理策略,默认值为“delete”。如果要采用日志压缩的清理策略,则设置为“compact”。可以同时支持设置两种策略。粒度可以控制到主题级别。

1.1 日志删除

Kafka日志管理器有一个专门的日志删除任务来周期性地检测和删除不符合保留条件的日志分段文件。周期通过broker端参数log.retention.check.interval.ms来配置,默认值为5分值。

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

1.1.1 删除操作

将不符合保留条件的日志分段加入到deletableSegments集合中,如果其数量等于该日志文件中所有日志分段的数量,但该日志文件必须保证有一个活跃的日志分段,此时,会先切分出一个新的日志分段作为activeSegment,然后执行删除操作。

删除日志分段时,首先会从Logo对象所维护的日志分段跳跃表中移除待删除的日志片段,以保证没有线程对这些日志分段进行读取操作,然后将日志分段所对应的所有文件添加上”.deleted”的后缀,最后交由一个以“delete-file”命名的延迟任务来删除这些文件。

1.1.2 基于时间

日志删除任务会检查当前日志文件中是否有保留时间超过设定的阈值。阈值通过broker端参数log.retention.hours、log.retention.monutes和log.rention.ms来配置,默认值为7天。

检查日志的保留时间,是根据日志分段中最大的时间戳来计算。如果不存在,则取该日志最近修改的时间。

1.1.3 基于日志大小

删除任务会检查当前日志的大小是否超过设定的阈值(通过broker端参数log.retention.bytes来配置)。默认值为-1,表示无穷大。删除算法如下:

  1. 计算日志文件的总大小和阈值的差值。
  2. 从日志的第一个日志分段开始,将日志分段加入到deletableSegments中,直到集合中分段的总大小大等于阈值。
  3. 删除这些日志分段。

1.1.4 基于日志起始偏移量

判断某日志分段的下一个日志分段起始偏移量baseOffset是否小等于logStartOffset(可以通过DeleteRecordsRequest请求指定)。如果是,则将这个日志分段加入到deletableSegments。

1.2 日志压缩

对于有相同key的不同value值,只保留最后一个版本。

如果应用只关心key对应的最新value,则可以开启Kafka日志压缩清理功能。

日志压缩会生成新的日志分段文件,因为其执行过后的偏移量不再是连续的,但这并不影响日志的查询。

1.2.1 清理检查点文件

在日志目录下,名为“cleaner-offset-checkpoint”的文件。

用于存储每个日志的最后清理偏移量(标识了日志清理线程已经清理到的位置)。 使得Kafka能够在系统重启或故障恢复后,从上次清理结束的位置继续清理日志。

图 清理检查点

起始节点:日志消息开始的偏移量(不一定从0 开始)。

checkpoint: 清理检查点,表示上次清理到的位置。

clean部分:已经清理过的部分,偏移量是断续的。 [起始节点,checkpoint)。

dirty部分:待清理的部分。[checkpoint,uncleanableOffset)。

为了避免当前活跃的日志分段activeSegment成为热点文件,其不会参与到清理中。

浑浊率 = dirty部分的日志大小 / (clean 部分的日志大小 + dirty部分的日志大小)

每个broker会启动日志清理线程负责清理任务,会选择“浑浊率”最高的日志文件进行清理。

1.2.2 清理过程

清理线程会使用“SkimpyOffsetMap”的对象来构建key与offset的映射关系的哈希表。最开始遍历dirty部分,把每个key的哈希值和最后出现的offset都保存在该Map中,第二次遍历clean + dirty部分,会检查每个消息是否复合条件(消息的offset是否大等于其key保存在map中的offset),不符合的会被清理。

注意:两个不同的key但哈希值相同的情况可能会发送,但概率非常小。

1.2.3 墓碑消息

消息的key不为null,但其value为null,那么此消息就是墓碑消息。清理线程发现墓碑消息会先进行上面常规的清理,并且保留墓碑消息一段时间,然后再删除。

1.2.4 日志片段合并

Log Compaction 执行过后的日志分段的大小会比原先的日志分段要小,为了防止出现太多的小文件,在实际的清理过程中并不对单个的日志分段进行单独清理,而是将日志文件从起始到uncleanableOffset的所有日志分段进行分组,同一组的多个日志分段清理过后,只会生成一个新的日志分段。

分组策略:按照日志分段的顺序遍历,每组中日志分段总大小不能超过segmentSize,且对应的索引文件总大小不能超过maxIndexSize。

图 执行Log Compaction

清理过程中,会将每个日志分组中需要保留的消息复制到以“.clean”为后缀的临时文件中,例如第一个分组中起始偏移量为0,则命名为00000000000000000000.log.clean。清理完成后将“.clean”修改为“.swap”,然后把原本的日志文件删除,最后才把“.swap”后缀去掉。索引文件的变换也是如此。

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

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

相关文章

Semantic Kernel - Kernel理解

目录 一、关于Kernel 二、案例实战 三、运行截图 一、关于Kernel 微软的 Semantic Kernel 项目中,Semantic Kernel 是一个工具框架,旨在使得开发人员能够更容易地将大语言模型(如GPT)集成到不同的应用中。它通过提供一组接口、任务模板和集成模块,使开发者能够轻松地设计…

svn: E000111: Error running context: Connection refused

1、具体报错: 看起来是window主机的子系统ubuntu svn客户端无法访问到window主机的svn的服务端。 2、问题: window主机安装子系统ubuntu,ubuntu是可以直接访问外网,但是ubuntu是不能访问window主机的服务,比如svn的se…

【时时三省】(C语言基础)对比一组函数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 对比一组函数 比如对比一下scanf fscanf sscanf和printf fprintf sprintf scanf 针对标准输入的格式化的输入语句 其实它针对的是stdin fscanf 针对所有输入流的格式化的输入语句 它是针对s…

(MySQL)头歌数据库作业答案

1.数据库和表的基本操作 1.1数据库和表的基本操作(一) 第1关:查看表结构与修改表名 本关任务:修改表名,并能顺利查询到修改后表的结构。 USE Company;#请在此处添加实现代码 ########## Begin ###################…

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…

Direct Preference Optimization (DPO): 一种无需强化学习的语言模型偏好优化方法

论文地址:https://arxiv.org/pdf/2305.18290 1. 背景与挑战 近年来,大规模无监督语言模型(LM)在知识获取和推理能力方面取得了显著进展,但如何精确控制其行为仍是一个难题。 现有的方法通常通过**强化学习从人类反馈&…

ppp综合实验

IP地址 r1 r2 r3 r4 hdlc封装 pap认证 r2 r3 chap认证 r2 r4 MGRE 主认证 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.4.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 12.1.1.1 [r1-Tunnel0/0/0]nhrp entry multicast dynamic [r1-Tu…

高效流式大语言模型(StreamingLLM)——基于“注意力汇聚点”的突破性研究

论文地址:https://arxiv.org/pdf/2309.17453 github地址:https://github.com/mit-han-lab/streaming-llm 1. 研究背景与挑战 随着大语言模型(LLMs)在对话系统、文档摘要、代码补全和问答等领域的广泛应用,如何高效且准…

学习数据结构(2)空间复杂度+顺序表

1.空间复杂度 (1)概念 空间复杂度也是一个数学表达式,表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复杂…

【测试】UI自动化测试

长期更新,建议关注收藏点赞! 目录 概论WEB环境搭建Selenium APPAppium 概论 使用工具和代码执行用例。 什么样的项目需要自动化? 需要回归测试、自动化的功能模块需求变更不频繁、项目周期长(功能测试时长:UI自动化测…

IoTDB 2025 春节值班与祝福

2025 春节快乐 瑞蛇迎吉庆,祥光映华年,2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐,“蛇”来运转! IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日,1 月 25 日、26…

想品客老师的第七天:闭包和作用域

闭包之前的内容写在这里 环境、作用域、回收 首先还是数据的回收问题,全局变量一般都是通过关闭页面回收的;而局部变量的值不用了,会被自动回收掉 像这种写在全局里的就不会被主动回收捏: let title 荷叶饭function fn() {ale…

如何在IDEA社区版Service面板中管理springboot项目

1、开启service仪表盘 2、在service仪表盘中,添加启动类配置项,专业版是SpringBoot 、社区版是application。 3、控制台彩色日志输出 右键启动类配置项,添加虚拟机参数 -Dspring.output.ansi.enabledALWAYS

网盘资源查找工具---AI功能

01 软件介绍 这是一款融入了ai技术的网盘搜索神器,可以让你更快,更精准的找到自己需要的文件,不管你是找影视,音乐,还是找软件或者学习资料都可以,欢迎前来使用。 02 功能展示 该软件非常简洁&#xff…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟:生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置,而且全局时钟缓存扇出必须低于 2000 个负载。 注释: 当与其他时钟约束配合…

蓝桥杯3518 三国游戏 | 排序

题目传送门 这题的思路很巧妙,需要算出每个事件给三国带来的净贡献(即本国士兵量减其他两国士兵量)并对其排序,根据贪心的原理累加贡献量直到累加结果不大于0。最后对三国的胜利的最大事件数排序取最值即可。 n int(input()) a …

【redis初阶】redis客户端

目录 一、基本介绍 二、认识RESP(redis自定的应用层协议名称) 三、访问github的技巧 四、安装redisplusplus 4.1 安装 hiredis** 4.2 下载 redis-plus-plus 源码 4.3 编译/安装 redis-plus-plus 五、编写运行helloworld 六、redis命令演示 6.1 通用命令的…

LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…

HttpClient学习

目录 一、概述 二、HttpClient依赖介绍 1.导入HttpClient4依赖 2.或者导入HttpClient5依赖 3.二者区别 三、HttpClient发送Get请求和Post请求测试 (一)通过HttpClient发送Get请求 (二)通过HttpClient发送Post请求 一、概述 HttpClient是 Apache 软件基金会提供的一…