问题现象
最近发现一个问题,Kafka 0.9(含)以上版本Broker在运行长一段时候,经过重启,会有很长一段时间(30min)不能正常对外提供服务。 现象:consumer的OffsetCommit、JoinGroup、LeaveGroup、SyncGroup、Heartbeat等API会一直出现NOT_COORDINATOR_FOR_GROUP(16, new NotCoordinatorForGroupException("This is not the correct coordinator for this group."))(KAFKA ERROR CODE 16, 不同语言的Client可能字符串不大相同,但是错误code一定相同),持续很长时候后(30min)后自动恢复正常。
原因
Kafka 0.9后使用了一个内部topic __consumer_offsets 作为consumer的元数据(group coordinator、commited-offset等)的存储介质,这些元数据0.8时是存储在zookeeper上的。经常长时间的线上运行__consumer_offsets的partition的磁盘占用会持续增大,造成重启时,需要经过很长时间去加载__consumer_offsets内的数据,导致在这段加载时间内,该broker不能正常对外提供服务,造成consumer client持续报错。加载__consumer_offsets的日志在kafka的server.log中。 image001.png
解决:
需要开启log.cleaner功能,删掉过期堆积的log数据。 修改配置文件,重启broker: log.cleaner.enable=true log.cleanup.policy= delete 在0.8版本中的配置文件中的默认值是log.cleaner.enable=false,我们错误地将0.8配置文件中的这项拷贝到0.9的Kafka后造成了以上问题。
相关参考:
https://issues.apache.org/jira/browse/KAFKA-3000 https://issues.apache.org/jira/browse/KAFKA-2988 https://mail-archives.apache.org/mod_mbox/kafka-users/201603.mbox/%3CCAHXdron8fePyDwyk-YnmcSz1zDO9qFDRJgLa1x8rxHwz2PTzow@mail.gmail.com%3E