Kafka 消息不能接收的问题
Kafka发送消息后, consumer不能接收
问题现象
应用系统上做了一个操作后,后续操作未执行。 操作之间的衔接是通过kafka消息来通讯的
问题排查
可能原因猜测: 1. 消费类挂掉了,没有监听? 2. kafka故障?
-
看下消费类所在的应用,发现有异常挂掉了。
问题在此,重启解决之。启动日志看到消费类正常建立监听的信息。
手工推送一个消息,还是未收到。 -
kafka自己启动了一个consumer来进行消息消费
手工推送一个消息,没有消费掉
./kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --from-beginning --topic DATA_SEND_SendContractGoods_sit
此时怀疑kafka有问题,但不是很确定,因为集群中部署了三个kafka应用,不可能同时出现故障
- 自己手工建立了一个test topic,创建、消费消息,正常
./kafka-console-consumer.sh --zookeeper 192.168.6.33:2181 --from-beginning --topic test_ax
此时比较困惑了,kafka正常 or 异常
- 此时误打误撞,看了下topic的信息
Topic:DATA_SEND_SendContractGoods_sit PartitionCount:1 ReplicationFactor:1 Configs:
Topic: DATA_SEND_SendContractGoods_sit Partition: 0 Leader: -1 Replicas: 1 Isr:
Topic:EFFECTIVE_COST_SIT PartitionCount:1 ReplicationFactor:1 Configs:
Topic: EFFECTIVE_COST_SIT Partition: 0 Leader: 2 Replicas: 2 Isr: 2
Leader:-1,看着这个觉得不对劲,百度下,Leader 为-1的情况:
1.broker shutdown的时候,partition的leader在此broker上,controller选主没有成功,移除此broker后,对应的partition的leader就被赋值成-1了。
2.给此broker发送stopReplicaRequest
调用controller.removeReplicaFromIsr,从zk读取当前partition的状态,从isr中移除此broker,并更新zk信息(如果leader为此broker,则新leader被置为-1,代表没有leader,为什么没有选择isr中其他broker为leader?)
发送leaderAndIsrRequest到此partition的leader,发送updateMetaRequest给所有broker
更新ReplicaStateMachine中replicaState的状态。
比对看了下建立的测试的topic, Leader是3,故能正常消费
Topic:test_ax PartitionCount:1 ReplicationFactor:1 Configs:
Topic: test_ax Partition: 0 Leader: 3 Replicas: 3 Isr: 3
将三台kafka重启后,通讯正常
问题原因:
公司部署的kafka有三台机器组成了一个集群,这个topic只建立了一个分区, 对应分区挂掉后,leader变成了-1,无法进行消息处理? 重启这台机器后也不行?
据运维同事反应,早上有一台kafka挂掉了,然后重启了。
待验证的猜想: kafka集群中,某个topic只有一个分区,对应分区机器挂掉后重启,Leader仍无法恢复?
自己本机验证的时候,创建topic只有一个分区,对应leader的kafka关掉后,消息发送异常,leader为-1, 再启动此kafka,其他的kafka不重启,消息可以正常通讯
解决思路
修改默认topic创建的分区数,可以是集群机器的整数倍。
对已有topic调整。 1:重新部署kafka,修改配置。 此时原有消息内容全部丢失; 2:针对具体topic来修改分区数
参考资料
http://blog.csdn.net/lizhitao/article/details/45380811
http://blog.csdn.net/lizhitao/article/category/2194509
更多推荐
所有评论(0)