kafka 消费不到数据,报错NoReplicaOnlineException

  其他常见问题
内容纲要

概要描述

523开安全的环境,操作姿势正确,但是消费者消费不到数据;具体排查会发现 state 日志中报错如下:

kafka.common.NoReplicaOnlineException: No replica for partition [_consumer_offset,16] is alive. Live brokers are: [Set(25, 26, 27)], Assign ed replicas are: [List(30.29.28)]

详细说明

原理是 consumer_offsets 是管理consumer group消费情况的。如果这个topic异常了肯定会影响消费的,如果 consumer_offsets 里记录的 brokerid 和集群实际 id 不一致,会影响 consumer 正常消费;

在 controller 启动的过程中会更新内存里一个记录 topic partition 的 cache,当消费者要去消费的时候会发送 topic meta 给 controller,controller 会根据 cache 的信息返回给consumer。因为 controller 启动有问题,所以这个 cache 没有更新成功,所以发送给 consumer的topic meta 里 partition 信息为空,所以无法消费,所以是因为 consumer_offset 记录了历史信息,broker id 和当前broker id 不一致导致 controller 启动异常。


解决方案

  1. 停止 producer,确认所有的数据都被消费完
  2. 停止 kafka 服务
  3. 删除 /hadoop/kmq 下面的数据,所有 kafka server 节点都要删
  4. 删除 zk 上 /brokers/topics (rmr /brokers/topics)
  5. 启动 kafka
    此时 /hadoop/kmq 和 /brokers/topics 下没啥数据,/hadoop/kmq 下只有一些 checkpoint文件
  6. 创建一个新的 topic,再消费它,此时 __consumer_offsets 这个目录就重新生成了

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。