【问题标题】:Kafka __consumer_offsets growing in sizeKafka __consumer_offsets 越来越大
【发布时间】:2019-01-04 13:33:36
【问题描述】:

我们将 Kafka 用作严格排序的队列,因此使用了 single topic/single partition/single consumer group 组合。我以后应该可以使用多个分区了。

我的消费者是spring-boot 应用侦听器,它从同一个主题产生和消费。所以消费者群体是固定的,永远只有一个消费者。

Kafka version 0.10.1.1

在这种情况下,topic-0 和一些__consumer_offsets_XX 的日志文件会增长。事实上__consumer_offsets_XX 增长得非常高,即使它应该每 60 分钟定期清除一次(默认情况下)。消费者并非一直在阅读,但它有auto.commit.enabled=true

默认log.retention.minutes(默认7天)>offset.retention.minutes(默认1天);但就我而言,因为我的消费者群体/消费者是固定的和单一的;一旦消息被使用,将消息保存在topic-0 中可能没有任何意义。我可以让log.retention.minutes 缩短 3 天(比如说)吗?

我可以将offset.retention.minutes 调低,以便能够控制__consumer_offsets_XX 不断增长的大小,而无需触摸auto.commit 设置吗?

【问题讨论】:

  • 每当 Kafka 收到一条消息时,它都会增加偏移量,即使数据过期(即保留时间),该偏移量也不会减少。 data 和 offset_value 不是同义词。

标签: apache-kafka kafka-consumer-api spring-kafka


【解决方案1】:
  1. 更改 offset.retention.minutes 无济于事。这是为了释放非活动组的偏移量使用的空间。假设您没有太多非活动组 id,则不需要它。

  2. 更改偏移量主题的 log.retention.bytes 配置,并根据需要将其设置为较低的值。您可以使用 Kafka-config.sh 或您知道的其他方式更改此配置。

一旦您限制了主题大小,kafka 压缩将在主题大小达到阈值时启动并为您清理。

【讨论】:

    【解决方案2】:

    offsets.retention.minuteslog.retention.XXX 属性将影响记录/消息/日志的物理删除仅当偏移文件 rolling occurs 时。

    一般来说,offsets.retention.minutes 属性规定如果消费者在指定的时间内消失,代理应该忘记您的消费者,并且即使不从磁盘中删除日志文件也可以这样做

    如果您将此值设置为一个相对较低的数字并在没有活跃消费者的情况下检查您的 __consumer_offsets 主题,随着时间的推移,您会注意到以下内容:

        [group,topic,7]::OffsetAndMetadata(offset=7, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1557475923142, expireTimestamp=None)
        [group,topic,8]::OffsetAndMetadata(offset=6, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1557475923142, expireTimestamp=None)
        [group,topic,6]::OffsetAndMetadata(offset=7, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1557475923142, expireTimestamp=None)
        [group,topic,19]::NULL
        [group,topic,5]::NULL
        [group,topic,22]::NULL
    

    这表示事件存储系统(如 Kafka)的一般工作方式。他们记录新事件,而不是更改现有事件。

    我不知道默认情况下每 60 分钟删除/清理一次主题的任何 Kafka 版本,我感觉您误解了文档中的某些内容。

    似乎__consumer_offsets 的管理方式与常规主题有很大不同。删除__consumer_offsets 的唯一方法是强制滚动其文件。但是,这与常规日志文件不同。虽然常规日志文件(用于您的数据主题)每次被删除时都会自动滚动,但无论log.roll. 属性如何,__consumer_offsets 都不要这样做。如果它们没有滚动并停留在初始的...00000 段,它们根本不会被删除。因此,减少__consumer_offsets 文件的方法似乎是:

    1. 设置比较小log.roll.;
    2. 如果您有能力断开消费者的连接,请操作 offsets.retention.minutes
    3. 否则调整log.retention.XXX属性。

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 2017-10-15
      • 2019-07-01
      • 1970-01-01
      • 2012-09-12
      • 2020-10-16
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多