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

版本配置:
       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,但问题还是会出现。求大佬指教。






发表于: 26天前   最后更新时间: 26天前   游览量:300
上一条: 到头了!
下一条: 已经是最后了!

评论…


  • 这个问题应该是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个小时,但是本地消费程序可以将当前偏移量指向末尾,但是项目上的消费者就不行。本地和项目中的消费者属于同一个消费组
                你怎么判断变为最小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组又开始消费了。
                            • 刚刚又确认了一遍,没有生成新的消费者组。而且如果有生成新消费组,那么应该所有topic的数据都会重新消费。但只有部分topic会出现这个情况。
                                • 不是,在项目里面做的。我试下使用命令来测试下看能不能发现什么异常。不过,可能有些难测试。这个重启重复消费是在消费者跑了一段时间重启才会出现的。
                                  • 评论…
                                    • in this conversation