问题描述
最近在折腾 Kafka 0.9.0.0 版本,发现了个头疼的问题。用旧版 API 的消费者能正常收消息,但新版 API 的消费者却啥也收不到。这是咋回事呢?
环境搭建
先说说我的环境。ZooKeeper 在 localhost:2181
上跑着,Kafka Broker 在 localhost:9092
上监听。然后,我用控制台生产者往 "test" 主题里发了几条消息,内容大概是这样的:
复制
yello
is this thing on?
let's try another
gimme more
旧版 API 消费者
用旧版 API 的消费者命令,消息收得明明白白:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
新版 API 消费者
但新版 API 的消费者就不行了,命令是这样的:
bin/kafka-console-consumer.sh --new-consumer --topic test --from-beginning --bootstrap-server localhost:9092
结果啥消息也收不到。这是 Kafka 的 bug 还是我操作有问题?
解决方案
后来,好几个小伙伴都遇到了类似的问题,大家分享了一些解决办法:
-
删除 ZooKeeper 中的
/brokers
节点:-
进入 ZooKeeper shell:
bin/zookeeper-shell localhost:2181
-
删除
/brokers
节点:rmr /brokers
-
重启 Kafka 节点。虽然不知道为啥这样能行,但确实解决了问题。
-
-
调整配置参数:
-
检查
offsets.topic.replication.factor
配置,确保它不超过 broker 的数量。如果只有一个 broker,可以将这个值设为 1:offsets.topic.replication.factor=1
-
修改
server.properties
文件后,重启 Kafka 和 ZooKeeper。
-
-
指定分区:
-
如果上述方法都不行,可以尝试指定分区:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic --partition 0
-
这样可以确保消费者从指定分区接收消息。
-
-
检查 broker 状态:
-
确保所有 broker 都在运行。如果有 broker 挂了,可能会导致某些分区不可用,从而影响消费者接收消息。
-
-
使用正确的命令参数:
-
使用
--bootstrap-server
时,确保提供的是 broker 的地址;使用--zookeeper
时,确保提供的是 ZooKeeper 的地址。
-