【问题标题】:Leader Not Available Kafka in Console Producer控制台生产者中的领导者不可用 Kafka
【发布时间】:2016-06-17 18:06:03
【问题描述】:

我正在尝试使用 Kafka。
所有配置均已正确完成,但是当我尝试从控制台生成消息时,我不断收到以下错误

WARN Error while fetching metadata with correlation id 39 : 
     {4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

Kafka 版本:2.11-0.9.0.0

【问题讨论】:

  • 我使用的是 2.11-0.9.0.0 版本,我说所有配置都是正确的,因为它可以工作。
  • @Vishesh 你能提供以下命令的结果吗./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic yourTopicName
  • 对我来说也有同样的错误。我得到了领导者 ./bin/kafka-topics.sh --zookeeper :2181 --describe --topic yourTopicName 但是在向生产者发送消息时,它一直抛出错误 LEADER_NOT_AVAILABLE。
  • 我可以在 2019 年在 kafka 2.2.0 上确认这个问题
  • 我的情况是我使用了通配符监听,自动创建新主题会导致这个错误。

标签: apache-kafka producer


【解决方案1】:

这可能与您的server.properties 中的advertised.host.name 设置有关。

可能发生的情况是您的生产者试图找出谁是给定分区的领导者,找出它的advertised.host.nameadvertised.port 并尝试连接。 如果这些设置没有正确配置,它可能会认为领导者不可用。

【讨论】:

  • 这为我修复了错误.. 但是 server.properties 中的 cmets 说如果没有配置adverted.host.name,它将使用host.name。并且 host.name 是在 server.properties 文件中配置的。
  • 我遇到了同样的问题,这对我来说适用于 kafka 0.9
  • 将此设置为我的 IP 地址而不是 AWS 生成的公共主机名解决了我遇到的许多问题。
【解决方案2】:

我尝试了此处列出的所有建议。对我有用的是转到server.properties 并添加:

port = 9092
advertised.host.name = localhost 

listenersadvertised_listeners 注释掉。

【讨论】:

【解决方案3】:

为我解决的问题是像这样设置监听器:

advertised.listeners = PLAINTEXT://my.public.ip:9092
listeners = PLAINTEXT://0.0.0.0:9092

这使得 KAFKA 代理监听所有接口。

【讨论】:

  • 这应该是公认的答案。适用于多节点配置并且很有意义。
  • 我们可以在 app.yaml 文件中使用它吗?
  • 如果你需要在 docker-compose 上设置它,在 kafka 的“环境”属性下:ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 LISTENERS: PLAINTEXT://0.0.0.0:9092跨度>
【解决方案4】:

在过去 2 周里,我在使用 Kafka 时也遇到了同样的问题,并且一直在阅读 Stackoverflow 的这篇文章。

经过 2 周的分析,我推断在我的情况下 会发生这种情况 尝试向不存在的主题生成消息时

在我的情况下,结果是 Kafka 发回了一条错误消息,但在 同时,之前不存在的话题。因此,如果我在此事件之后再次尝试向该主题生成任何消息,则该错误将不再显示为已创建的主题。

请注意:可能是我的特定 Kafka 安装配置为在不存在主题时自动创建主题;这应该可以解释为什么在我的情况下,在重置主题后,每个主题只能看到一次问题:您的配置可能不同,在这种情况下,您会一遍又一遍地收到相同的错误。

【讨论】:

  • 嗨卢卡。我也在自动创建新主题。我的问题是你如何让你的消费者自动发现这个新话题?我的消费者不会这样做。在我重新启动消费者后,可以接收到新消息,但导致创建主题的消息丢失了。
  • 是的,kafka 会自动创建主题。这应该被接受的答案。至少这个对我有用。我很高兴你发布了这个。谢谢。
  • 就我而言,我创建了一个主题。昨天,它正在生产数据。今天,它没有产生任何数据。只给出错误 LEADER_NOT_AVAILABLE。我现在该怎么办?
【解决方案5】:

我让 kafka 作为 Docker 容器运行,类似的消息涌入日志。
KAFKA_ADVERTISED_HOST_NAME 被设置为“kafka”。

在我的情况下,错误的原因是“kafka”容器本身中“kafka”的 /etc/hosts 记录丢失。
因此,例如,在 'kafka' 容器内运行 ping kafka 会失败并显示 ping: bad address 'kafka'

就 Docker 而言,这个问题可以通过为容器指定 hostname 来解决。

实现它的选项:

【讨论】:

  • 这不是答案本身,但供将来参考:当(或如果)docker/docker#1143 得到解决时,将有一种简单的方法来引用容器的主机—无论使用哪种操作系统。
  • 如果您使用的是wurstmeister/kafka-docker docker 镜像(这可能是撰写本文时最流行的镜像),see notes here 关于设置该环境变量及其原因
【解决方案6】:

我正在使用 kafka_2.12-0.10.2.1:

vi config/server.properties

添加以下行:

listeners=PLAINTEXT://localhost:9092
  • 无需更改advertised.listeners,因为它会获取值 来自 std 侦听器属性。

代理将向生产者和消费者宣传的主机名和端口。如果没有设置,

  • 如果已配置,它会使用“listeners”的值

否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。

停止 Kafka 代理:

bin/kafka-server-stop.sh

重启代理:

bin/kafka-server-start.sh -daemon config/server.properties

现在您应该看不到任何问题。

【讨论】:

  • 这为我解决了这个问题,修改 server.properties 是不够的,直到我用重新加载的守护程序重新启动代理。也许您应该知道这一点,但这确实有助于在此答案中指定它
  • 这对我有用,非常感谢兄弟。我正在使用kafka 2.13
【解决方案7】:

当我们尝试订阅尚未创建的主题时,往往会收到此消息。我们通常依赖于在我们部署的环境中先验地创建主题,但是我们有针对 dockerized kafka 实例运行的组件测试,该实例每次都启动干净。

在这种情况下,我们在测试设置中使用AdminUtils 来检查主题是否存在,如果不存在则创建它。有关设置 AdminUtils 的更多信息,请参阅此 other 堆栈溢出。

【讨论】:

    【解决方案8】:

    此警告的另一种可能性(在 0.10.2.1 中)是您尝试对刚刚创建的主题进行轮询,并且该主题分区的领导者尚不可用,您正在领导选举中.

    在主题创建和轮询之间稍等片刻是一种解决方法。

    【讨论】:

    • 这是我的问题。
    【解决方案9】:

    对于任何尝试在 kubernetes 上运行 kafka 并遇到此错误的人,这就是最终为我解决的问题:

    您必须:

    1. hostname 添加到 pod 规范中,这样 kafka 可以找到自己。

    1. 如果使用hostPort,则需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet

    这是因为 Kafka 需要与自己对话,它决定使用“广告”侦听器/主机名来查找自己,而不是使用 localhost。 即使您有一个将广告主机名指向 pod 的服务,它在 pod 内也是不可见的。我真的不知道为什么会这样,但至少有一个解决方法。

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: zookeeper-cluster1
      namespace: default
      labels:
        app: zookeeper-cluster1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: zookeeper-cluster1
      template:
        metadata:
          labels:
            name: zookeeper-cluster1
            app: zookeeper-cluster1
        spec:
          hostname: zookeeper-cluster1
          containers:
          - name: zookeeper-cluster1
            image: wurstmeister/zookeeper:latest
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 2181
            - containerPort: 2888
            - containerPort: 3888
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: zookeeper-cluster1
      namespace: default
      labels:
        app: zookeeper-cluster1
    spec:
      type: NodePort
      selector:
        app: zookeeper-cluster1
      ports:
      - name: zookeeper-cluster1
        protocol: TCP
        port: 2181
        targetPort: 2181
      - name: zookeeper-follower-cluster1
        protocol: TCP
        port: 2888
        targetPort: 2888
      - name: zookeeper-leader-cluster1
        protocol: TCP
        port: 3888
        targetPort: 3888
    
    ---
    
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: kafka-cluster
      namespace: default
      labels:
        app: kafka-cluster
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kafka-cluster
      template:
        metadata:
          labels:
            name: kafka-cluster
            app: kafka-cluster
        spec:
          hostname: kafka-cluster
          containers:
          - name: kafka-cluster
            image: wurstmeister/kafka:latest
            imagePullPolicy: IfNotPresent
            env:
            - name: KAFKA_ADVERTISED_LISTENERS
              value: PLAINTEXT://kafka-cluster:9092
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zookeeper-cluster1:2181
            ports:
            - containerPort: 9092
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: kafka-cluster
      namespace: default
      labels:
        app: kafka-cluster
    spec:
      type: NodePort
      selector:
        app: kafka-cluster
      ports:
      - name: kafka-cluster
        protocol: TCP
        port: 9092
        targetPort: 9092
    

    【讨论】:

    • 1.不起作用%错误:本地:主机解析失败:kafka-cluster:9092/1001:无法解析“kafka-cluster:9092”:提供节点名或服务名,或未知
    • 我添加了与服务名称相同的主机名,为我工作!
    • 感谢上帝!!!我已经打开了类似的问题,并且我同意您在 k8s env 中唯一需要的是主机名,而且您在 kafka 部署中还需要 kafka_listeners:-名称:KAFKA_LISTENERS 值:PLAINTEXT://:9092
    • 这解决了我的问题。我真是太感谢你了!我花了一天时间处理这个问题。
    • @Chris 在尝试此操作时,我收到错误消息 - Got user-level KeeperException when processing sessionid:************* type:setData cxid:0xdb zxid: 0x55 txntype:-1 reqpath:n/a 错误路径:/config/topics/__consumer_offsets 错误:KeeperErrorCode = NoNode for /config/topics/__consumer_offsets.. 你能帮忙吗
    【解决方案10】:

    添加它是因为它可能对其他人有所帮助。常见问题可能是 advertised.host.name 配置错误。使用 Docker 使用 docker-compose 设置 KAFKA_ADVERTISED_HOST_NAME 中的服务名称将不起作用,除非您也设置主机名。 docker-compose.yml 例子:

      kafka:
        image: wurstmeister/kafka
        ports:
          - "9092:9092"
        hostname: kafka
        environment:
          KAFKA_ADVERTISED_HOST_NAME: kafka
          KAFKA_CREATE_TOPICS: "test:1:1"
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    

    上面没有hostname: kafka 可以在尝试连接时发出LEADER_NOT_AVAILABLE。 您可以找到一个有效的 docker-compose 配置示例 here

    【讨论】:

      【解决方案11】:

      在我的情况下,它在家工作正常,但在我连接到办公室网络的那一刻,它在办公室就失败了。

      所以修改了config/server.properties listeners=PLAINTEXT://:9092 到 listeners=PLAINTEXT://localhost:9092

      就我而言,我是在描述消费者群体时得到的

      【讨论】:

      • 为什么他们没有设置正确的默认值,这对我有帮助。
      【解决方案12】:

      如果您在本地机器上运行 kafka,请尝试使用以下行更新 $KAFKA_DIR/config/server.properties: listeners=PLAINTEXT://localhost:9092 然后重启kafka。

      【讨论】:

      【解决方案13】:

      我正在使用 docker-compose 使用 wurstmeister/kafka 图像构建 Kafka 容器。将KAFKA_ADVERTISED_PORT: 9092 属性添加到我的docker-compose 文件为我解决了这个错误。

      【讨论】:

        【解决方案14】:

        由于我希望我的 kafka 代理连接远程生产者和消费者,所以我不希望 advertised.listener 被注释掉。就我而言,(在 kubernetes 上运行 kafka),我发现我的 kafka pod 没有分配任何集群 IP。通过从 services.yml 中删除行 clusterIP: None,kubernetes 为 kafka pod 分配了一个内部 IP。这解决了我的 LEADER_NOT_AVAILABLE 问题以及 kafka 生产者/消费者的远程连接问题。

        【讨论】:

          【解决方案15】:

          当 LEADER_NOT_AVAILABLE 错误抛出时,只需重启 kafka 代理:

          /bin/kafka-server-stop.sh
          

          紧随其后

          /bin/kafka-server-start.sh config/server.properties
          

          (注意:此时 Zookeeper 必须运行,否则将无法正常工作)

          【讨论】:

          • 是的。发生在首先启动 kafka,然后启动 zookeeper 时。
          • 我已经这样做了,但并没有完全解决它。奇怪的是,代理确实像领导者一样初始化。如New leader is 0
          【解决方案16】:

          如果您收到类似这样的重复错误消息:

          Error while fetching metadata with correlation id 3991 : {your.topic=LEADER_NOT_AVAILABLE}
          

          或者

          Discovered group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
          (Re-)joining group (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:509)
          Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)
          Discovered group coordinator 172.25.40.219:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
          Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)
          

          然后,你需要在 kafka server.properties 中像这样配置监听器设置:

           listeners=PLAINTEXT://your.server.ip:9092
          

          这是在 Apacke Kafka 2.5.0 和融合平台 5.4.1 上尝试的解决方案。

          【讨论】:

          【解决方案17】:

          我在config/server.properties 中添加了以下行,它解决了与上述问题类似的问题。希望这会有所帮助,它在 server.properties 文件中有很好的记录,在修改之前尝试阅读和理解。 advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

          【讨论】:

            【解决方案18】:

            我也收到了同样的错误信息

            在获取关联 ID 为 39 的元数据时出现警告错误: {4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

            解决步骤:

            • 转到C:\Windows\System32\drivers\etc\hosts
            • 如果以下行不存在,则将其添加到hosts 文件的末尾
            127.0.0.1       localhost
            
            • 转到C:\<Kafka_Config_Path>\server.properties,然后在文件末尾添加
                advertised.listeners = PLAINTEXT://localhost:9092
                listeners = PLAINTEXT://0.0.0.0:9092
            
            • 重启 Kafka 服务器

            【讨论】:

              【解决方案19】:

              对于所有在 Kafka ssl 设置中苦苦挣扎并看到此 LEADER_NOT_AVAILABLE 错误的人。可能被破坏的原因之一是密钥库和信任库。在密钥库中,您需要拥有服务器的私钥 + 签名的服务器证书。在客户端信任库中,您需要具有中间 CA 证书,以便客户端可以对 kafka 服务器进行身份验证。如果您将使用 ssl 进行代理间通信,您还需要在代理的 server.properties 中设置此信任库,以便它们可以相互验证。

              最后一块我错误地丢失了,让我花了很多时间来找出这个 LEADER_NOT_AVAILABLE 错误可能意味着什么。希望这可以帮助某人。

              【讨论】:

              • “服务器的私钥”是什么意思?我在服务器密钥库中有 CA 密钥和签名服务器证书,而在客户端信任库中我有 CA 证书。但我仍然收到这些错误 ..
              • 对不起,我的意思是私钥+证书。我正在建立大型集群,但官僚机构链中的某个地方犯了一个错误,因此其中一个证书与 CSR 不匹配。这也可能是其他原因。仔细检查私钥、证书的 md5 是否匹配,并且可以使用您的信任库验证该证书。信任库通常包含根证书和中间证书
              【解决方案20】:

              在位于 config 目录的 server.properties 文件中添加监听器设置后问题得到解决。 listeners=PLAINTEXT://localhost(或您的服务器):9092 更改后重新启动 kafka。使用的版本 2.11

              【讨论】:

                【解决方案21】:

                上述答案中提到的广告听众可能是原因之一。其他可能的原因是:

                1. 可能尚未创建主题。您可以使用bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port> 进行检查
                2. 检查您提供给生产者的引导服务器以获取元数据。如果引导服务器不包含有关该主题的最新元数据(例如,当它丢失了 Zookeeper 声明时)。您必须添加多个引导服务器。

                另外,请确保您将广告侦听器设置为 IP:9092 而不是 localhost:9092。后者意味着代理只能通过本地主机访问。

                当我遇到错误时,我记得在引导服务器列表(或代理列表)中使用了 PLAINTEXT://<ip>:<PORT> 并且它奇怪地工作了。

                bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>
                

                【讨论】:

                  【解决方案22】:

                  对我来说,我没有为 Kafka 实例指定代理 ID。 它有时会在 Docker 环境中重新启动时从 zookeeper 获取一个新的 id。 如果你的broker id大于1000,只需指定环境变量KAFKA_BROKER_ID即可。

                  使用它来查看代理、主题和分区。

                  brew install kafkacat
                  kafkacat -b [kafka_ip]:[kafka_poot] -L
                  

                  【讨论】:

                  • 这对我有帮助。 Zookeeper 就像集群管理器并跟踪所有代理,即使您只使用 1 个代理。如果您未指定代理 ID,则会分配一个随机 ID,并且看起来不同的代理正在连接和断开连接。创建主题时,将为一个代理分配该主题的领导者,因此如果第一个代理永远断开连接,您将永远无法再次向该主题生成消息。我还必须在 /opt/zookeeper-3.4.13/data 和 wurstmeister/kafka 清除我的数据目录,然后重新开始。
                  【解决方案23】:

                  试试这个 listeners=PLAINTEXT://localhost:9092 一定有帮助

                  非常感谢

                  【讨论】:

                  【解决方案24】:

                  对我来说,这是由于配置错误
                  Docker 端口 (9093)
                  Kafka 命令端口 "bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TopicName"
                  我检查了我的配置以匹配端口,现在一切正常

                  【讨论】:

                    【解决方案25】:

                    对我来说,原因是使用了不属于 Kafka 包的特定 Zookeeper。该 Zookeeper 已经安装在机器上用于其他目的。显然 Kafka 不能与任何 Zookeeper 一起工作。切换到 Kafka 附带的 Zookeeper 为我解决了这个问题。为了不与现有的 Zookeeper 冲突,我不得不修改我的配置,让 Zookeeper 监听不同的端口:

                    [root@host /opt/kafka/config]# grep 2182 *
                    server.properties:zookeeper.connect=localhost:2182
                    zookeeper.properties:clientPort=2182
                    

                    【讨论】:

                      【解决方案26】:

                      我知道这是很久以前发布的,我想分享我是如何解决它的。
                      因为我有我的 办公室笔记本电脑VPN 和代理已配置)。
                      我检查了环境变量 NO_PROXY

                      > echo %NO_PROXY%
                      

                      它返回空值
                      现在我已经用 localhost127.0.0.1

                      设置了 NO_PROXY
                      > set NO_PROXY=127.0.0.1,localhost  
                      

                      如果要附加到现有值,则

                      > set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  
                      

                      在此之后,我重新启动了 zookeeper 和 kafka
                      像魅力一样工作

                      【讨论】:

                        猜你喜欢
                        • 2018-05-13
                        • 2016-07-19
                        • 1970-01-01
                        • 2017-02-28
                        • 2020-03-30
                        • 2016-11-13
                        • 1970-01-01
                        • 2019-09-24
                        • 2021-11-08
                        相关资源
                        最近更新 更多