kafka的某些topic在消费完毕后一段时间重启唯一消费者会重置为最小offset重新消费?

♂裝純男た 发表于: 2018-10-24   最后更新时间: 2021-08-30 00:22:58   14,455 游览

版本配置:

kafka版本为kafka_2.10-0.10.2.0,单broker单分区单消费者,log.retention.hours设置为168。结合spring-kafka使用,consumer的group.id不变,auto.offset.reset设置为earliest,client.id未指定,由spring-kafka自动生成。enable.auto.commit设置为false,手动提交offset。

问题描述:

在消费数据完毕后,使用命令./kafka-consumer-groups.sh --bootstrap-server localhost:9094 --describe --group group-name 查询到的topic的lag为0.不做任何更改,即时重启消费者,无异常。等过了约一天到两天再进行重启,部分topic会重置为最小offset重新消费。。。查询到生成的client.id是同一个。

命令删除过topic,但问题还是会出现。求大佬指教。

发表于 2018-10-24
添加评论

这个问题应该是offset信息过期导致的。我一直以为消费者保持在线,最新位移信息是不会过期的。但即使消费者在线,位移信息也会如约过期。配置的数据保留时间log.retention.hours=168小时比位移保留时间offsets.retention.minutes=1440即24小时要长。offset信息过期后,重启消费者。由于找不到offset信息,会根据配置auto.offset.reset=earliest从最小位移开始消费,导致之前已经消费的数据再次被消费。

我们在使用kafka的时候也有遇到过这样的情况,但一直没有查到是什么原因导致的,你说的最新位移信息过期是怎么体现的,如何查看是否过期;没有找到原因之前我们决定使用seek方法去重置偏移量,重置偏移量的程序是本地编写的,但是发现重置后项目中的消费者无法从修改后的偏移量进行消费,而是从修改之前的地方消费的;而本地编写的消费程序是可以取消费到的。

使用命令./kafka-consumer-groups.sh --bootstrap-server localhost:9094 --describe --group group-name可查看对应的位移信息,如过期则显示横杆。我没使用过程序去重置偏移量,直接使用命令重置可正常消费。重置后从修改之前的地方消费具体是到哪个位置?本地编写的消费程序与前面提及消费者是属于同一个消费组的吗?

我查看了一下没有消费到数据是因为测试环境的数据只保留了1个小时,但是本地消费程序可以将当前偏移量指向末尾,但是项目上的消费者就不行。本地和项目中的消费者属于同一个消费组

如果数据已过期,是无法再重置到其偏移量再进行消费的。server配置的数据和位移保留时间分别为多少?两个消费者的配置一样吗?我觉得需要具体查看下对应的位移信息才能确定。

只要提交offset过期时间就会重新计时。以下转载自 https://www.jianshu.com/p/5a7249df82a8 : consumer的commit offset保存在broker集群的有50个partition的内部topic里,保存时间 offsets.retention.minutes (1440 minutes = 1 day) 的意思是说超过这个时间没有再次commit就删除该consumer的commit offfset,意义在于删除长期离线的consumer的commit信息。如果consumer从broker取commit时,还没有提交过offset或是已经被删除,就返回0。

楼主解决了吗? 我也遇到这个情况,重启相同group id的消费者后 lag会变大,offset会变小,重复消费了以前消费过的数据

♂裝純男た -> Vayne 5年前

已解决,找到的问题在上个评论。

你怎么判断变为最小offset的呢?
每个消费者组的offset都是不同的。

目前只有一个消费组。
使用命令./kafka-run-class.sh kafka.tools.GetOffsetShell --topic data-topic1 --time -2 --broker-list localhost:9094 --partitions 0 来查询异常data-topic1的最小值为31。
重启消费者前使用./kafka-consumer-groups.sh --bootstrap-server localhost:9094 --describe --group group-name查看到data-topic1的 current-offset=log-end-offset=140515,lag为0.
重启后再使用命令查看到data-topic1的current-offset只有几十,lag却是140000+。马上把消费者停了,此时log还有138984。当时也没有截图,不过看到时current-offset应该是从31+开始增长的。

你重启后也应该使用 kafka-consumer-groups.sh --bootstrap-server localhost:9094 --describe --group group-name 来确认你的offset位置的。因为kafka的topic有很多不同的组都在消费,所以你要看具体你的那个消费者组消费到哪里了,你的是group-name这个组消费到哪里了。

是的,消费者重启后也是使用同一命令确认offset位置。而且,只有group-name这一个消费组,且组中也只有一个消费者。重启消费者前我确认数据已经消费完毕,lag为0。没有新数据生产,但重启后group-name组又开始消费了。

bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server localhost:9092 --list
是不是你每次都生成新的消费者组了,你执行下看看消费者列表。

刚刚又确认了一遍,没有生成新的消费者组。而且如果有生成新消费组,那么应该所有topic的数据都会重新消费。但只有部分topic会出现这个情况。

你是用命令直接做的测试吗?
https://www.orchome.com/454

不是,在项目里面做的。我试下使用命令来测试下看能不能发现什么异常。不过,可能有些难测试。这个重启重复消费是在消费者跑了一段时间重启才会出现的。

你的代码了。你关闭程序的时候注意优雅停机。很多也许都缓存还没来得及通知kafka

kafka基本没重启过,主要关闭消费者都是直接kill的,确实比较暴力了。我再重新排查一遍。非常感谢您的耐心回答,谢谢。

你的答案

查看kafka相关的其他问题或提一个您自己的问题