Kafka的Log Compaction原理是什么?

Kafka的Log Compaction(日志压缩)是一种独特的数据保留策略,其核心原理是保留每个key的最新有效记录。以下是关键原理分点说明:

1. 键值保留机制

通过扫描所有消息的key,仅保留每个key对应的最新value值。例如:

原始日志: 
(key1, v1)(key2, v2)(key1, v3)(key2, v4)压缩后日志:
(key1, v3)(key2, v4)

2. 压缩触发条件

Kafka的脏数据比例计算

数学公式

脏数据比例 = (相同key的旧版本记录总大小) / (当前日志段总大小)

示例场景分析
假设日志段包含4条等体积记录:

(keyA, v1) → (keyB, v2) → (keyA, v3) → (keyB, v4)
  1. 有效数据:v3(keyA最新值)+ v4(keyB最新值)= 2条记录
  2. 脏数据:v1(keyA旧值)+ v2(keyB旧值)= 2条记录
  3. 实际脏数据比例:2/4=50%(达到默认触发阈值)

特殊场景验证
当出现以下情况时比例会变化:

  • 非均匀分布
    假设段中有6条记录:3个key各有两个版本

    (k1,v1)→(k2,v2)→(k3,v3)→(k1,v4)→(k2,v5)→(k3,v6)
    

    脏数据 = v1+v2+v3 = 3条 → 比例3/6=50%

  • 跨段分布
    若旧版本分布在多个segment中,则单个segment可能不达阈值

监控验证方法
通过kafka自带工具查看具体segment状态:

# 查看segment元数据
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log

输出示例:

offset: 0 key: keyA payload: v1
offset: 1 key: keyB payload: v2 
offset: 2 key: keyA payload: v3  ← 最新有效值
offset: 3 key: keyB payload: v4  ← 最新有效值

此时该segment的脏数据比例为50%。
脏数据就是指的该数据有多版本数据。

日志段含义(物理分片)

Kafka的日志段大小(Log Segment Size)指的是单个日志文件在磁盘上的物理存储限制,其核心要点如下:

  1. 存储单元划分
    每个partition的日志被拆分为多个固定大小的segment文件(默认1GB),文件命名采用base offset数值:
00000000000000000000.log  // 起始offset=0的segment
00000000000005368769.log  // 起始offset=5368769的segment
  1. 配置参数
    通过server.properties控制:
# 单个segment最大字节数(默认1GB)
log.segment.bytes=1073741824# 时间维度滚动策略(默认7天)
log.roll.hours=168
  1. 滚动触发机制
    满足以下任一条件即创建新segment:
  • 当前segment大小超过log.segment.bytes
  • 当前segment存活时间超过log.roll.ms/log.roll.hours
  • 消息最大时间戳与创建时间差超过阈值
  1. 物理文件组成
    每个segment包含三个物理文件:
00000000000000000000.log  // 消息数据
00000000000000000000.index // 位移索引
00000000000000000000.timeindex // 时间戳索引
  1. 性能影响
  • 大segment(如5GB)→ 减少文件数,提高顺序IO性能,但增加故障恢复时间
  • 小segment(如500MB)→ 加快日志压缩和消息过期,但增加文件切换开销

实际查看segment文件示例(Windows路径):

# 查看segment文件列表
dir C:\kafka\data\test-topic-0
# 输出示例:
# 00000000000000000000.log
# 00000000000000000000.index
# 00000000000000000000.timeindex

检查log.cleaner.backoff.ms

log.cleaner.backoff.ms 配置的检查间隔主要用于检查以下内容:

  1. 日志段清理条件检查
    检查各个分区的日志段是否满足清理条件:
  • Compact策略下消息键的最新值是否可合并
  • Delete策略下是否超过日志保留时间/大小限制
  • 是否有足够可回收的磁盘空间
  1. 清理任务调度检查
    评估当前系统的负载情况,决定是否启动新的清理任务:
  • 检查可用的清理线程数
  • 判断当前CPU/IO资源使用率是否允许执行清理
  • 验证待清理分区是否处于可操作状态
  1. 清理进度检查
    监控正在执行的清理任务:
  • 确认当前清理操作是否超时
  • 检查已完成清理的分区是否需要后续处理
  • 验证清理后的日志段索引是否有效

配置建议:

# 当需要更频繁检查时(如高吞吐量场景)
log.cleaner.backoff.ms=5000
# 当需要降低资源消耗时(如边缘设备部署)
log.cleaner.backoff.ms=30000

1 Kafka官方文档指出,该参数控制清理线程在两次检查之间的休眠时间,这个间隔直接影响日志清理的实时性和系统资源消耗的平衡。

当满足以下条件时触发压缩:

  • 脏数据比率超过 min.cleanable.dirty.ratio(默认0.5)
  • 日志段大小达到 segment.bytes(默认1GB)
  • 达到 log.cleaner.backoff.ms 配置的检查间隔(默认15秒)

3. 墓碑消息机制

当需要删除某个key时,会写入value为null的墓碑消息。该消息会保留 delete.retention.ms(默认24小时)后才会被清除。(这是约定的,开发者需要知道并配合kafka的特性来开发,可以依赖该特性进行空间优化。)

4. 物理存储优化

采用copy-on-write机制:

  • 创建新segment文件写入有效数据
  • 完成后原子替换旧文件
  • 旧文件异步删除

5. 应用场景特征

适合需要维护最终状态的场景:
✅ 数据库变更捕获(CDC)
✅ 配置信息更新跟踪
✅ 实时物化视图维护
❌ 不适合审计日志等需要完整历史记录的场景

实际配置示例:

cleanup.policy=compact
min.cleanable.dirty.ratio=0.3
delete.retention.ms=86400000  # 24小时
segment.bytes=1073741824      # 1GB

该机制通过空间换时间的方式,在保证最新状态可查的同时,显著降低存储消耗(实测可减少50%-90%存储空间)。

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

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

相关文章

在 MyBatis 中实现控制台输出 SQL 参数

在 MyBatis 中实现控制台输出 SQL 参数,可通过以下方案实现: # 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推荐) ‌适用场景‌:项目已集成 MyBatis-Plus(3.5.3版本) ‌配置步骤‌&#xff…

黄金、碳排放期货市场API接口文档

StockTV 提供了多种期货市场的数据接口,包括获取K线图表数据、查询特定期货的实时行情等。以下为对接期货市场的详细接口说明。 一、获取K线图表数据 通过调用/futures/kline接口,您可以获取指定期货合约的历史K线数据(例如开盘价、最高价、…

“ES7+ React/Redux/React-Native snippets“常用快捷前缀

请注意,这是一个常用的列表,不是扩展提供的所有前缀。最完整和最新的列表请参考扩展的官方文档或在 VS Code 中查看扩展的详情页面。 React (通常用于 .js, .jsx, .ts, .tsx): rfce: React Functional Component with Export Defaultrafce: React Arro…

[Windows] 能同时打开多个图片的图像游览器JWSEE v2.0

[Windows] 能同时打开多个图片的图像游览器JWSEE 链接:https://pan.xunlei.com/s/VOPpO86Hu3dalYLaZ1ivcTGIA1?pwdhckf# 十多年前收藏的能同时打开多个图片的图像游览器JWSEE v2.0,官网已没有下载资源。 JWSEE v2.0是乌鲁木齐金维图文信息科技有限公司…

[AI Tools] Dify 工具插件上传指南:如何将插件发布到官方市场

Dify 作为开源的 LLM 应用开发平台,不仅支持本地化插件开发,也提供了插件市场机制,让开发者能够将自己构建的插件发布并供他人使用。本文将详细介绍如何将你开发的 Dify Tools 插件上传至官方插件市场,包括 README 编写、插件打包、仓库 PR 等核心步骤。 一、准备 README 文…

gradle3.5的安装以及配置环境变量

下载资源 Gradle |释放 往下滑找到3.5版本,有条件的翻译一下 这是原文点击下载后解压 随后配置环境变量 变量名 GRADLE_HOME 变量值为bin路径 配置path环境 win11直接添加%GRADLE_HOME%\bin 随后进入命令提示符 输入gradle -v 能看到版本号即为成功

单片机开发基础与高效流程

单片机开发涉及硬件与软件的紧密协作,是嵌入式系统的核心技术之一。以下从开发流程、调试技巧、代码优化等方面详细阐述高效开发方法。 一、开发环境搭建与配置 选择合适的开发工具链是高效开发的基础。以 STM32 为例,常用工具包括: IDE 选…

大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners​

论文链接: Language Models are Unsupervised Multitask Learners 点评: GPT-2采用了与GPT-1类似的架构,将参数规模增加到了15亿,并使用大规模的网页数据集WebText 进行训练。正如GPT-2 的论文所述,它旨在通过无监督语…

数字孪生[IOC]常用10个技术栈(总括)

1. 什么是数字孪生? 数字孪生(Digital Twin) 是通过数字化技术对物理实体(如设备、系统或环境)进行高精度建模和实时映射的虚拟副本。其核心是通过 数据驱动 实现物理世界与虚拟世界的双向交互,支持实时监控…

cnas软件检测实验室质量管理体系文件思维导图,快速理清全部文件

软件检测实验室在申请CNAS资质时,需要根据认可文件的要求,建立实验室质量管理体系,明晰地展示组织架构、合理地安排人员岗位职责和能力要求、全面地覆盖认可文件要求的质量要素。这是一项非常庞大的工作,涉及到的文件类型非常多&a…

[Windows] 东芝存储诊断工具1.30.8920(20170601)

[Windows] 东芝存储诊断工具 链接:https://pan.xunlei.com/s/VOPpMjGdWZOLceIjxLNiIsIEA1?pwduute# 适用型号 东芝消费类存储产品: 外置硬盘:Canvio 系列 内置硬盘:HDW****(E300 / N300 / P300 / S300 / V300 / X30…

C++ learning day 01

目录 1. iostream : 2.第一个C++程序 3. 执行过程以及以上例子详解(以上例子为参考) 1. iostream : 全称: input/output stream library 作用: 用于处理输入输出操作 2.第一个C++程序 #include <iostream>int main() {std::cout << "Hello World! &qu…

单位代码签名证书是什么?如何申请?

软件安全已成为企业不可忽视的核心话题&#xff0c;当用户下载企业级软件时&#xff0c;若遇到“未知发布者”的警告弹窗&#xff0c;很可能是由于软件未进行数字签名所致。这种看似简单的提示背后&#xff0c;隐藏着巨大的安全隐患与信任危机。而单位代码签名证书&#xff0c;…

《Zabbix Proxy分布式监控实战:从安装到配置全解析》

注意&#xff1a;实验所需的zabbix服务器的搭建可参考博客 zabbix 的docker安装_docker安装zabbix-CSDN博客 1.1 实验介绍 1.1.1 实验目的 本实验旨在搭建一个基于Zabbix的监控系统&#xff0c;通过安装和配置Zabbix Proxy、MySQL数据库以及Zabbix Agent&#xff0c;实现分…

泛型设计模式实践

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 为解决在设计框架或库时遇到的类型安全问题&#xff…

【kafla扫盲】FROM GPT

Kafka 扫盲指南&#xff1a;分布式流处理利器 Apache Kafka 是一个分布式流处理平台&#xff0c;最早由 LinkedIn 开发&#xff0c;后来开源并捐赠给 Apache 基金会。Kafka 专为高吞吐量、低延迟的实时数据流处理而设计&#xff0c;广泛用于日志收集、实时分析、消息队列、流处…

每天五分钟深度学习框架pytorch:视觉工具包torchvison

本文重点 在pytorch深度学习框架中,torchvision是一个非常优秀的视觉工具包,我们可以使用它加载一些著名的数据集,然后我们可以使用它来加载网络模型,比如vgg,resnet等等,还可以使用它来预处理一些图片数据,本节课程我们将学习一下它的使用方式。 torchvision的四部分…

操作系统 第2章节 进程,线程和作业

一:多道程序设计 1-多道程设计的目的 for:提高吞吐量(作业道数/处理时间),我们可以从提高资源的利用率出发 2-单道程序设计缺点: 设备的利用率低,内存的利用率低,处理机的利用率低 比如CPU去访问内存,CPU空转.内存等待CPU访问也是没有任何操作的.要是有多个东西要去访问不冲…

位移监测仪,精准测量,专业守护

地质灾害如滑坡、泥石流、地面沉降等具有突发性强、破坏性大的特点&#xff0c;传统人工巡查方式存在效率低、时效性差等缺陷。对人类生命财产构成严重威胁&#xff0c;因此需要实时、精准的位移监测手段。地质灾害监测预警系统集成了多种传感器&#xff0c;对地表及地下形变进…

dropout层

从你提供的图片来看&#xff0c;里面讨论了 Dropout 层&#xff0c;让我为你解释一下它的工作原理和作用。 Dropout 层是什么&#xff1f; Dropout 是一种常用的正则化技术&#xff0c;用于避免神经网络的 过拟合&#xff08;overfitting&#xff09;。过拟合是指模型在训练数…