我们将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
设置?
答案 0 :(得分:1)
offsets.retention.minutes
和log.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
文件的方法似乎是:
log.roll.
; offsets.retention.minutes
; log.retention.XXX
属性。答案 1 :(得分:0)
更改offset.retention.minutes将无济于事。这将为不活动的组释放偏移量所使用的空间。假设您没有太多不活动的组ID,则不需要它。
将log.retention.bytes配置更改为offsets主题,然后根据需要将其设置为较低的值。您可以使用Kafka-config.sh或您知道的其他方式更改此配置。
一旦您限制了主题大小,当主题大小达到阈值并为您清理时,kafka压缩就会开始。