我有一个3个节点的kafka集群。当节点#3死亡时,我的_schemas
主题停止正常运行,我看到了:
kafka-topics --zookeeper localhost:2181 --topic _schemas --describe
Topic:_schemas PartitionCount:1 ReplicationFactor:2 Configs:cleanup.policy=compact
Topic: _schemas Partition: 0 Leader: -1 Replicas: 3,2 Isr: 2
所以似乎节点#3已经死了,这就是Leader: -1
所指的那个。但是为什么Kafka不能像往常一样继续工作,将Node #2
指定为新的领导者并将数据复制到#1
,以便我们有2个同步副本?
我在kafka日志中看到的错误:
kafka.common.NotAssignedReplicaException:
Leader 3 failed to record follower 2's position -1 since the replica is not
recognized to be one of the assigned replicas 3 for partition <loop over many partitions>
答案 0 :(得分:0)
我通过重新启动控制器代理程序解决了此问题。每个kafka集群都有一个经纪人被选为控制人,因此它将协调领导者的选举。我们的情况是控制器卡住了。为了找到哪个代理是控制者,您只需转到zkCli.sh以访问您的kafka集群使用的zookeeper,然后执行get /controller
,您将在其中看到brokerId。
我很容易通过重新启动控制器代理来解决此问题,祝您好运。
答案 1 :(得分:-1)
如果您拥有一个包含3个kafka代理的群集,并且您的主题只有1个分区,则表示您只有one
个领导者,并且您正在生成数据并仅针对此代理进行操作。
如果你想要kafka:
继续像往常一样工作,将节点#2指定为新的领导者
您应该使用3个分区创建主题,每个代理将成为其他分区的领导者,如果其中一个代理失败,您将能够写入其他分区。
查看运行./kafka-topics.sh --zookeeper localhost:2181 --topic _schemas --describe
的示例:
Topic:_schemas PartitionCount:3 ReplicationFactor:1 Configs:retention.ms=14400000
Topic: _schemas Partition: 0 Leader: 2 Replicas: 2 Isr: 2
Topic: _schemas Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: _schemas Partition: 2 Leader: 1 Replicas: 1 Isr: 1
在此示例中,您可以看到_schemas
有3个分区,这意味着所有3个代理都是该主题的领导者,每个代理位于不同的分区上,st代理2是分区0上的领导者,代理0和代理1是分区上的追随者0