首页 > 解决方案 > kafka __consumer_offsets 主题日志的大小迅速增长,减少了磁盘空间

问题描述

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

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

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

感谢这里的任何帮助。

标签: apache-kafka

解决方案


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

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

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

然后你需要考虑log.retention.bytes,log.segment.bytes和的配置log.retention.check.interval.ms。为此,您必须考虑以下因素:

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

  • 同样,如果您在任何给定时间设置log.retention.bytes为 512MB 和log.retention.check.interval.ms5 分钟(这是默认值),则在触发保留策略之前,您将拥有至少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因为这可能会弄乱您的所有消费者。


推荐阅读