对于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。