此法可能有风险,还请读完文章再操作。
本文中的命令可以在Kafka非启动状态下执行。
起因
Kafka服务器在运行几个月后,存储空间耗尽了。分析Kafka的占用空间情况,发现Kafka自动生成的“__consumer_offset”topic,占用了大量空间,它用于记录每个用户topic的消费偏移量。这一topic适用的清理规则与其他topic不同,某些特殊情况下,它可能一直得不到清理,耗尽服务器资源。
查看清理策略
由于服务器上的Kafka版本较老,这里使用的参数是--zookeeper,而非−−bootstrap-server参数。
使用以下命令查看清理策略:
./kafka-configs.sh --zookeeper zk01:2181,zk02:2181,zk03:2181/kafka --entity-type topics --entity-name __consumer_offsets --describe
在这台服务器上,得到了下面结果:
Configs for topics:__consumer_offsets are segment.bytes=104857600,cleanup.policy=compact,compression.type=uncompressed
翻译一下就是:每个文件块大小100MB,清理策略为压缩,压缩策略为不压缩。
那当然服务器空间会被用完了。
处理
首先,将处理__consumer_offset的特殊清理策略删除:
./kafka-configs.sh --zookeeper zk01:2181,zk02:2181,zk03:2181/kafka --entity-type topics --entity-name __consumer_offsets --alter --delete-config cleanup.policy
据说这样已经可以让这里的清理策略与普通topic一致了,但是以防万一,再手动添加一组清理策略:
./kafka-configs.sh --zookeeper zk01:2181,zk02:2181,zk03:2181/kafka --alter --entity-name __consumer_offsets --entity-type topics --add-config retention.ms=604800000
./kafka-configs.sh --zookeeper zk01:2181,zk02:2181,zk03:2181/kafka --alter --entity-name __consumer_offsets --entity-type topics --add-config cleanup.policy=delete
这两行命令将__consumer_offset的清理逻辑调整为“清理7天前数据,清理策略为删除”
之后,将Kafka运行起来,就能看见大量数据被标记删除,静静等待一分钟(如果延时参数没被调整的话),Kafka就会自动将7天前的数据删除了。后续也不必操心服务器空间问题。
风险
虽然服务器空间问题得到了解决,但也有一个疑问:这是否会导致一些分区的offset记录消失,导致重复消费?
举例来说:一个topic有200条记录,消费者在8天前消费了100条,这8天内无消费者消费,也无生产者生产。
那么如果这个消费者在今天去消费,由于之前的消费记录超过7天无变化,很有可能已被删除。那消费者是否会从0号消息开始消费?
目前的环境中,topic保存数据也有7天的限制,规避了这个问题,但它确实有导致一些问题的可能。