内容纲要
概要描述
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 启动异常。
解决方案
- 停止 producer,确认所有的数据都被消费完
- 停止 kafka 服务
- 删除 /hadoop/kmq 下面的数据,所有 kafka server 节点都要删
- 删除 zk 上 /brokers/topics (rmr /brokers/topics)
- 启动 kafka
此时 /hadoop/kmq 和 /brokers/topics 下没啥数据,/hadoop/kmq 下只有一些 checkpoint文件 - 创建一个新的 topic,再消费它,此时 __consumer_offsets 这个目录就重新生成了