【问题标题】:kafka __consumer_offsets topic logs rapidly growing in size reducing disk spacekafka __consumer_offsets 主题日志的大小迅速增长,减少了磁盘空间
【发布时间】:2020-05-22 13:30:02
【问题描述】:

我发现__consumer_offsets主题日志的大小正在迅速增长,经过研究进一步发现了容量最大的主题。我更改了这些主题的保留政策以阻止增长速度,但想增加磁盘空间并删除 __consumer_offsets 主题的所有旧日志。

但这会导致所有其他主题和消费者/生产者损坏或丢失有价值的元数据。有没有办法我可以做到这一点?我正在查看配置的参数,其中包括清理策略和压缩,但不确定如何专门为导致这种快速增长的主题指定此参数。

https://docs.confluent.io/current/installation/configuration/topic-configs.html

在这里感谢任何帮助。

【问题讨论】:

  • “高音量”是什么意思。我们是在谈论数百 MB 还是 GB?

标签: apache-kafka


【解决方案1】:

在 Kafka 中,有两种类型的日志保留; 大小时间保留。前者由log.retention.bytes 触发,后者由log.retention.hours 触发。

在您的情况下,您应该注意 size 保留,这有时可能很难配置。假设您想要一个delete 清理策略,您需要将以下参数配置为

log.cleaner.enable=true
log.cleanup.policy=delete

那么你需要考虑log.retention.byteslog.segment.byteslog.retention.check.interval.ms的配置。为此,您必须考虑以下因素:

  • log.retention.bytes主题的单个分区的最低保证,这意味着如果您将log.retention.bytes 设置为 512MB,则意味着您将始终拥有 512MB 的数据(每分区)在您的磁盘中。

  • 同样,如果您在任何给定时间将 log.retention.bytes 设置为 512MB 并将 log.retention.check.interval.ms 设置为 5 分钟(这是默认值),您将拥有至少 512MB 的数据+ 在触发保留策略之前的 5 分钟窗口内产生的数据大小。

  • 磁盘上的主题日志由段组成。段大小取决于log.segment.bytes 参数。对于log.retention.bytes=1GBlog.segment.bytes=512MB,磁盘上始终最多有3 个段(2 个达到保留段,第3 个将是当前写入数据的活动段)。

最后,您应该进行数学运算并计算 Kafka 日志在任何给定时间可能在您的磁盘上保留的最大大小,并相应地调整上述参数。当然,我还建议设置时间保留策略并相应地配置log.retention.hours。如果 2 天后您不再需要您的数据,请设置 log.retention.hours=48


现在要更改仅针对 __consumer_offsets 主题的保留策略,您只需运行:

bin/kafka-configs.sh \
    --zookeeper localhost:2181 \
    --alter \
    --entity-type topics \
    --entity-name __consumer_offsets \
    --add-config retention.bytes=...

附带说明,您必须非常小心__consumer_offsets 的保留政策,因为这可能会搞乱您的所有消费者。

【讨论】:

  • 如果我理解正确,问题是关于 __consumer_offsets 的主题。在这种情况下,更改retention.bytes 将非常危险。想象一下,您有一个消费者 C1 从某个主题读取数据,然后该消费者暂停了较长时间,并且只有其他消费者处于活动状态。当一个消费者 C1 再次活跃时,可能是 C1 的偏移量已被清除...
  • @mike 我同意你的观点,这正是我在帖子末尾提到的。但是,假设保留政策将满足他的要求,这仍然是可能和可行的。
  • 非常感谢您的回复。如果我要更改 consumer_offsets 主题,这正是我所关心的。我了解其他主题的更改将减少这些日志大小,但我也想知道如何删除旧日志,以便我从较低的磁盘空间开始,而不是现在的 80% 使用率。目前无法获得额外的物理存储空间。
  • @user1585245 您不必手动删除任何内容。如果您相应地配置您的保留政策,它可能会立即生效。
  • 总的来说,我同意@GiorgosMyrianthous 的回答,但由于这个话题非常敏感,我在这里提出了另一个可以帮助你的建议。
【解决方案2】:

主题“__consumer_offsets”是一个内部主题,用于管理每个消费者组的偏移量。生产者不会受到本主题的任何更改/修改的直接影响。

这么说,也强调你的经验,你应该非常小心改变这个话题的配置。

我建议调整压缩主题的主题配置。清理策略应保持在“compacted”。

将默认为 MAX_LONG 的 max.compaction.lag.ms(集群范围设置:log.cleaner.max.compaction.lag.ms)减少为 60000 之类的值。

通过min.cleanable.dirty.ratio(集群范围设置:log.cleaner.min.cleanable.ratio)触发压缩时降低比率,默认为 0.5 到 0.1。

这样,压缩将更频繁地进行,而不会丢失任何重要信息。

删除 __consumer_offsets 中的旧记录

如果您使用许多独特的消费者组(例如,通过使用控制台消费者,它会在每次执行时默认创建一个随机消费者组),主题将会堆积。

要清除主题中的“旧的和不需要的”条目,您需要了解如何从 压缩 主题中删除消息。这是通过使用 null 值向主题生成消息来完成的。这样,您最终将删除相同密钥的消息。你只需要找出你想删除的消息的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2016-09-17
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多