在使用 Kafka 0.8.1 和 Zookeeper 3.4.6 时遇到 LeaderNotAvailableException

Posted

技术标签:

【中文标题】在使用 Kafka 0.8.1 和 Zookeeper 3.4.6 时遇到 LeaderNotAvailableException【英文标题】:Running into LeaderNotAvailableException when using Kafka 0.8.1 with Zookeeper 3.4.6 【发布时间】:2014-06-07 08:05:40 【问题描述】:

我根据他们的网站安装了 kafka 的稳定版本(0.8.1 和 2.9.2 Scala),并使用 3 节点 Zookeeper 集成(3.4.6)运行它。我尝试创建一个测试主题,但一直看到没有分配给主题分区的领导者:

[kafka_2.9.2-0.8.1]$ ./bin/kafka-topics.sh --zookeeper <zookeeper_ensemble> --describe --topic test-1
Topic:test-1    PartitionCount:1    ReplicationFactor:3 Configs:
    Topic: test-1   Partition: 0    **Leader: none**    Replicas: 0,1,2 **Isr:** 

我还是尝试使用控制台生产者写入主题,但遇到了 LeaderNotAvailableException 异常:

[kafka_2.9.2-0.8.1]$ ./kafka-console-producer.sh --broker-list <broker_list> --topic test-1

hello world

[2014-04-22 11:58:48,297] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,321] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,322] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,445] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,467] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,467] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,590] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,612] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,612] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,731] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,753] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,754] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,876] WARN Error while fetching metadata [TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,877] ERROR Failed to send requests for topics test-1 with correlation ids in [0,8] (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,878] ERROR Error in handling batch of 1 events (kafka.producer.async.ProducerSendThread)
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:90)
    at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:104)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:87)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:67)
    at scala.collection.immutable.Stream.foreach(Stream.scala:547)
    at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:66)
    at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:44)

我还应该声明,这最初工作了几天,然后突然创建的任何主题都出现了这个缺少领导者的问题。

【问题讨论】:

根据mvnrepository.com/artifact/org.apache.kafka/kafka_2.9.2/0.8.1,此版本的 kafka 将 zookeeper 版本 3.3.4 列为正确的 zookeeper dep,也许使用它可能会解决问题... 我也有同样的问题。我在网上找不到太多信息,除非 Kafka 没有正确关闭,这很可能会发生 - 请参阅 cwiki.apache.org/confluence/display/KAFKA/… 我们在主管中运行 Kafka,因此它可能会崩溃,使其自身处于不一致的状态,然后重新启动。但是如何解决呢? 【参考方案1】:

我遇到了同样的问题,从 1.7 到 1.6 解决了 JDK

【讨论】:

【参考方案2】:

我遇到了同样的问题。最后我不得不删除停止Kafka节点,然后follow the advice here on how to delete Kafka topics。一旦我摆脱了破碎的主题,我就能够再次成功地启动 Kafka。

我想知道是否有更好的方法,以及将来如何避免这种情况发生。

【讨论】:

【参考方案3】:

Kafka 使用外部协调框架(默认为 Zookeeper)来维护配置。似乎配置现在与 Kafka 日志数据不同步。在这种情况下,我会删除受影响的主题数据和相关的 Zookeeper 数据。

对于测试环境:

    停止Kafka-serverZookeeper-server 删除两个服务的数据目录,默认为/tmp/kafka-log/tmp/zookeeper。 再次启动Kafka-serverZookeeper-server 创建一个新主题

现在您可以再次使用该主题了。

对于生产环境:

由于 Kafka 主题存储在不同的目录中,您应该删除特定的目录。您还应该使用 Zookeeper 客户端从 Zookeeper 中删除 /brokers/broker_id/topics/broken_topic

在你做任何愚蠢的事情之前,请仔细阅读 Kafka 文档以确保配置结构。 Kafka 正在推出删除主题功能 (KAFKA-330),以便更轻松地解决问题。

【讨论】:

重新启动所有 kafka 节点会处理在删除和创建主题后未重新创建分区和缺少领导者的问题。由于我正在使用的 kafka 版本没有正确的删除机制,我不得不操纵 Zookeeper 键来删除主题和消费者偏移【参考方案4】:

有同样的问题。确保您的消费者/生产者正在使用的每个分区上至少有一个主题。如果没有主题使用该分区,Zookeeper 将找不到该分区的领导者

【讨论】:

【参考方案5】:

这是JDK的问题。

我已经安装了openjdk

java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

但我将其更改为 oracle jdk(点击此链接:http://www.webupd8.org/2012/06/how-to-install-oracle-java-7-in-debian.html

java version "1.7.0_80" Java(TM) SE Runtime Environment (build
1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

现在它工作正常。希望这会有所帮助。

【讨论】:

【参考方案6】:

我通过在/etc/hosts 中添加一个带有完全限定主机名的127.0.0.1 条目解决了这个问题:

127.0.0.1       x4239433.your.domain.com x4239433

生产者和消费者开始正常工作。

【讨论】:

或者在config/server.properties中设置advertised.host.name=localhost。即使在生产中,这通常也是一个好主意。【参考方案7】:

我有同样的问题。事实证明,Kafka 要求机器的主机名可解析才能连接回自身。

我在我的机器上updated the hostname,重新启动zookeeper和kafka后,主题可以正确写入。

【讨论】:

【参考方案8】:

我遇到过几次这个问题,终于弄清楚我为什么会遇到这个问题。我也将在这里添加调查结果。我在 Linux VM 上,简短的回答是,因为我的 VM 获得了新 IP,所以我遇到了这个问题。如果您查看配置文件并打开 server.properties,您将看到这一行

advertised.host.name=xx.xx.xx.xxx 或 localhost。

确保此 IP 与您当前的 IP 匹配,您可以检查您的 IP here。

一旦我解决了这个问题,一切都开始正常工作。我使用的是 0.9.0.0 版本。

我希望这对某人有所帮助。

【讨论】:

【参考方案9】:

所以还有一个可能的答案——kafka config/server.properties 中的advertised.hostname 中的 IP 地址可能因额外的空格而输入错误。

在我的情况下

advertised.host.name=10.123.123.211_\n (where _ is an extra space)

而不是正确的

advertised.host.name=10.123.123.211\n

由于某种原因,它运行了 6 个月而没有出现任何问题,并且可能是某些库更新删除了 IP 地址的轻松查找,从而减少了额外的空间。

简单修复配置文件并重启kafka即可解决此问题。

【讨论】:

【参考方案10】:

当我尝试在本地系统 (mac OS X El Capitan) 中使用 Kafka 时,我遇到了完全相同的问题。问题出在我的动物园管理员身上,它不是指正确的配置文件。 重启zookeeper,然后重启Kafka,执行如下命令。检查领导者是否不是无。如果 Leader 不存在,则删除该主题并重新创建它。

kafka-topics --zookeeper localhost:2181 --describe --topic pytest

输出会是这样的

Topic:pytest    PartitionCount:1    ReplicationFactor:1 Configs:
Topic: pytest   Partition: 0    Leader: 0   Replicas: 0 Isr: 0

我希望这会有所帮助。

【讨论】:

【参考方案11】:

我在 Openshift 中遇到了KafkaZookeeper pod 的问题,并且 Kafka 启用了 TLS。 我不得不将以下环境变量添加到 Kafka,

KAFKA_ZOOKEEPER_CONNECT

KAFKA_SSL_KEYSTORE_LOCATION

KAFKA_SSL_TRUSTSTORE_LOCATION

KAFKA_SSL_KEYSTORE_PASSWORD

KAFKA_SSL_TRUSTSTORE_PASSWORD

KAFKA_ADVERTISED_LISTENERS

KAFKA_INTER_BROKER_LISTENER_NAME

KAFKA_LISTENERS

设置变量后,我必须删除并重新创建 pod 才能使其正常工作。

【讨论】:

【参考方案12】:

在 config/server.properties 中添加“advertised.host.name=localhost”并重启 Kafka 服务器。它对我有用

【讨论】:

以上是关于在使用 Kafka 0.8.1 和 Zookeeper 3.4.6 时遇到 LeaderNotAvailableException的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Kafka 0.8.1 和 Zookeeper 3.4.6 时遇到 LeaderNotAvailableException

Docker实战之Kafka集群

kafka安装及配置过程

kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载安装和配置(图文详细教程)绝对干货

在 Kafka 0.8.1.1 中删除主题

为啥搭建Kafka需要zookeeper