对于ReplicaFetcherThread,Kafka Endless NotLeaderForPartitionException
我有一个3节点Kafka集群,它使用映像wurstmeister / kafka:0.10.1.1在Kubernetes上运行 。
Zookeeper集群由3个版本为3.4.8的节点组成。
我注意到id 2的卡夫卡经纪人无休无止地打印着这条消息:
[2017-05-08 13:51:16,748]错误[ReplicaFetcherThread-0-0],分区[partition_name,5]到代理0错误:org.apache.kafka.common.errors.NotLeaderForPartitionException:此服务器不是该主题分区的领导者。 (kafka.server.ReplicaFetcherThread)
这条消息每秒钟都会打印很多分区。 经纪人2的日志达到了10GB以上。
纵观Zookeeper,我可以看到代理2没有列在znode / brokers / id中 。
每个Zookeeper和Kafka节点都有自己的k8s 部署和服务 (如zk-service-1 – > zk-deployment-1,zk-service-2 – > zk-deployment-2 …)。 Zookeeper节点通过k8s服务名称相互认识。 例如在文件属性中,服务器1具有以下行: server.1 = zk-service-1:2888:3888 。
对于Kafka也是如此:代理X具有advertised.host.name属性= kafka-X,其中kafka-X是与该代理的pod关联的服务名称。 代理zookeeper.connect属性是zk-service-1,zk-service-2,zk-service-3。
我将该pod的主机名设置为附加的服务名称。
我不知道如何正确debugging,哪些信息可以帮助我理解这个问题。 你有什么线索吗?
我看到的方式是,你正在寻找你的节点有一致的主机名。
我很确定,如果您使用称为statefulset
的控制器来部署zookeeper,那么解决您拥有一致主机名的问题。 你不必做所有命名豆荚的黑客。
deployment
创buildpod,但pod的名称不同,但statefulset
会创build具有一致名称的pod,并且通过无头服务来公开它。 所以基本上你直接和豆荚交谈。
阅读更多有关statefulsets
在这里和基本在这里 。
或者对于configuration,您可以从以下zookeeperconfiguration和kafkaconfiguration中获得帮助。
以上configuration可以在这里find。