Kafka 的日志清理策略:delete 和 compact

Kafka delete 日志清理策略(日志删除)

  • 原理:按照一定保留策略,直接删除不符合条件的日志分段。Kafka 把 topic 的一个 partition 大文件分成多个小文件段,通过这种方式,能方便地定期清除或删除已消费完的文件,以减少磁盘占用 。
  • 保留策略
    • 按时间删除 :设定一个时间阈值,删除修改时间在该时间之前的日志。比如设置log.retention.hours = 1 ,就表示只保存 1 小时内的日志,超出 1 小时的日志分段会被删除。
    • 按大小删除 :指定一个数据大小阈值,当日志数据超过这个大小时,执行删除操作,保留最后的指定大小数据。例如log.retention.bytes = 1073741824 (即 1GB ),表示日志数据超过 1GB 时,会删除旧的消息。
  • 相关参数
    • log.cleanup.policy = delete :启用删除策略。
    • log.retention.check.interval.ms :专门的日志删除任务周期性检测的时间间隔,默认 300000ms(5 分钟 ),即每隔 5 分钟检查一次是否有符合删除条件的日志分段 。
    • log.retention.hours :按时间清理时,指定日志保留的小时数 。
    • log.retention.bytes :按大小清理时,指定日志保留的字节数 。需注意log.retention.bytes和log.retention.hours任意一个达到要求,都会执行删除操作,且会被 topic 创建时的指定参数覆盖 。

Kafka compact 日志清理策略(日志压缩)

  • 原理:针对每个消息的 key 进行整合,对于有相同 key 的不同 value 值,只保留最后一个版本 。就像在一个记录集合里,相同标识(key )的记录,只留下最新的那条 。比如一个 key 对应的值先后为 "值 1""值 2""值 3" ,经过日志压缩后,只会保留 "值 3" 。清理重复 key 后,一些 segment 文件大小会变小,Kafka 会将小文件再合并成大的 segment 文件 。
  • 特殊处理 :当某个 key 的最新版本消息没有内容(value 为 null )时,这个 key 将被删除,这类消息被称为 "墓碑消息(tombstone )" 。墓碑消息的存放时间和 broker 的配置log.cleaner.delete.retention.ms有关,默认值是 24 小时 。在执行日志清理时,会删除到期的墓碑消息 。
  • 清理流程
    • 对于每个 Kafka partition 的日志,以 segment 为单位,分为已清理和未清理部分,未清理部分又细分为可清理和不可清理的。
    • 每个日志目录下有cleaner - offset - checkpoint文件记录清理进度。
    • 找出可清理的 segment(active segment 不能清理,根据min.compaction.lag.ms配置判断其他 segment 是否能清理 ,即判断 segment 最后一条记录的插入时间是否超过最小保留时间 )。
    • 构建 SkimpyOffsetMap 对象(key 与 offset 的映射哈希表 ),遍历可清理 segment 的每条日志,将 key 和 offset 存入其中。
    • 再遍历已清理和可清理部分的 segment 日志,根据 SkimpyOffsetMap 判断是否保留日志 。
    • 执行清理操作,将可清理部分的 segment 变为已清理的,同时更新 cleaner checkpoint 记录的 offset 。
  • 相关参数
    • log.cleaner.enable = true :开启日志压缩功能。
    • log.cleanup.policy = compact :启用日志压缩策略 。
    • min.compaction.lag.ms :设置日志段中消息可被压缩的最小时间间隔 ,确保消息存留一定时间后才可能被清理 。
    • log.cleaner.delete.retention.ms :墓碑消息的保留时长 。
相关推荐
RobinXYuan14 小时前
【Kafka 源码手记】05 Broker 网络层与请求处理(中):Processor 事件循环与线上的字节
kafka·源码阅读
NiceZack15 小时前
Hadoop 部署全流程教程:从新装 CentOS 到伪分布式与完全分布式
hadoop·分布式·centos
傻啦嘿哟15 小时前
分布式爬虫架构:Redis+Scrapy打造企业级爬虫系统
分布式·爬虫·架构
坐吃山猪17 小时前
Kafka13-自定义分区器
kafka
starzy199018 小时前
Kafka请求进门口:Processor是怎么把请求读上来的
分布式·kafka
骑着蜗牛撵大象3272 天前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
德迅云安全-上官2 天前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏
麻瓜code2 天前
分布式锁演进:从一个用户下两单,到 Redisson,我改了四版
分布式·wpf
starzy19902 天前
Kafka网络层第一道门:Acceptor线程是怎么启动的
大数据·kafka
skywalk81632 天前
hive —— 多机 AI Agent 协同的任务总线:分布式,多节点同时运行,保障不会宕机
人工智能·hive·分布式