暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Apache Kafka:日志压缩

原创 简单 2022-09-16
1618

众所周知,大多数系统都使用Kafka来进行大规模消息的分布式和实时处理。在开始讨论这个话题之前,我假设你已熟悉Kafka的基本概念,如Broker、分区、主题、生产者和消费者。本文章讨论将日志压缩问题。

什么是日志压缩

Kafka日志压缩是一种混合方法,确保有一个有效的恢复策略。同时还可以管理数据日志,使其达到一个阈值限制。Kafka的官方文档说:

日志压缩是种机制,提供了细粒度的每条记录的保存,而不是粗粒度基于时间的保留。我们的想法是选择性地删除具有相同主键的最近更新记录。这样日志就能保证每个键至少有最新的状态。

简单的说,当Kafka在分区日志中收到相同键的新消息时,会删除旧的消息。它保证了至少拥有每个键的最后一个已知值的消息。这对于在系统故障或崩溃后恢复状态也非常有用。

Kafka日志压缩结构

在这里,日志有头部和尾部。压缩日志的头部与传统的Kafka日志相同。新的记录被添加到头部的末尾。所有的日志压缩都在日志尾部执行。压缩只在尾部进行。当压缩清理后重写时,尾部的记录总是保持原始偏移量。

image.png

Log Cleaner负责处理日志压缩。日志清理器是个后台线程池,它重新复制日志段文件,并删除键出现在日志头部的记录。日志压缩的实际过程如下图所示:
image.png

配置变量

  • min.compaction.lag.ms: 它是消息到达日志后,在压缩前必须经过的最小保证时间。它是消息在头部停留时间的最小值。
  • delete.retention.ms: 这是一条标记为删除的记录在主题中保留的最长时间。任何滞后时间大于delete.retention.ms的消费者将错过删除标记。
  • min.cleanable.dirty.ratio:在Kafka尝试压缩消息之前,分区日志中必须是”脏记录“的最小百分比。
  • max.compaction.lag.ms:消息写入和可被压缩之间的最大延迟。会覆盖min.cleanable.dirty.ration选项。即使脏记录比率低于阈值,也会压缩日志段。

创建日志压缩的主题

使用下面的Kafka控制台命令,可以轻易创建Kafka压缩的主题:

./kafka-topics.sh --create --zookeeper localhost:2181 --topic log-compacted-topic --replication-factor 2 --partitions 2 --config "cleanup.policy=compact,delete" --config "delete.retention.ms=1000" --config "segment.ms=1000" --config "min.cleanable.dirty.ratio=0.05"

使用案例

可以认为日志压缩是一种特殊的策略,用于满足某些情况。它非常适用于缓存,在这种情况下,你想实时保留每个键的最新值。假设你想在启动期间建立你的缓存。通过读取日志压缩的主题,可以在比使用SQL数据库更快的时间内建立缓存。

原文标题:Apache Kafka : Log Compaction
原文作者:Amarjeet Singh
原文地址:https://blog.knoldus.com/apache-kafka-log-compaction/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论