主持人无法在Console Producer中使用Kafka


172

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

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

卡夫卡版本: 2.11-0.9.0.0


您使用的是什么版本的kafka?您怎么知道所有配置都正确?请尝试添加更多信息
Nautilus

我使用的是2.11-0.9.0.0版本,我说所有配置都是正确的,因为它可以正常工作。
Vishesh

1
@Vishesh您能提供以下命令的结果吗?/bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic yourTopicName
avr

2
对我来说同样的错误。我正在成为领导者。/bin/kafka-topics.sh--zookeeper <ip>:2181 --describe --topic yourTopicName,但是在向生产者发送消息时,它不断抛出错误LEADER_NOT_AVAILABLE。
Vilva

2
我可以2.2.0在2019
javadba

Answers:


93

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

什么可能发生的是,你的制作人试图找出谁是领导者对给定分区,从其数字advertised.host.nameadvertised.port,并尝试连接。如果未正确配置这些设置,则可能会认为领导者不可用。


1
这为我修复了错误..但server.properties中的注释说,如果未配置advertised.host.name,它将使用host.name。并且host.name是在server.properties文件中配置的。
Spark先生

我遇到了同样的问题,这对我来说适用于kafka 0.9
minhas23 '16

3
将其设置为我的IP地址而不是AWS生成的公共主机名解决了我遇到的许多问题。
Spechal

81

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

port = 9092
advertised.host.name = localhost 

离开listenersadvertised_listeners发表评论。


5
解决方案对我有用vikas的解决方案链接)只想为我添加MAC server.properties地址位于/usr/local/etc/kafka/
Edison Q

2
这对我advertised.listeners=PLAINTEXT://my.ip:9092
有用的

14
不要使用这个- portadvertised.host.name已被弃用CONFIGS。kafka.apache.org/documentation/#brokerconfigs
Stephane

44

为我解决的是像这样设置侦听器:

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

这使KAFKA经纪人可以监听所有接口。


4
这应该是公认的答案。适用于多节点配置,并且很有意义。
Piyush Shrivastava

我们可以在app.yaml文件中使用它吗?
编码器

40

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

在我的情况下,出错的原因是/etc/hosts“ kafka”容器本身中缺少“ kafka”记录。
因此,例如,ping kafka在“ kafka”容器中运行会因ping: bad address 'kafka'

就Docker而言,此问题可通过指定hostname容器来解决。

实现它的选项:


本身不是一个答案,而是供将来参考:当(或如果)docker / docker#1143解决时,将有一种简单的方法来引用容器的主机,无论使用哪种操作系统。
Michael Ahlers

如果您使用的是wurstmeister / kafka-docker docker镜像(在撰写本文时,它可能是最受欢迎的镜像),请参阅此处有关设置该env var的注意事项以及原因
RyanQuey

32

我正在使用kafka_2.12-0.10.2.1:

vi config/server.properties

添加以下行:

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

代理将向生产者和消费者通告的主机名和端口。如果未设置,

  • 如果配置,它将使用“侦听器”的值

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

停止卡夫卡经纪人:

bin/kafka-server-stop.sh

重新启动代理:

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

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


这为我解决了问题,server.properties直到我重新加载了代理的守护进程重新启动代理后,修改还不够。也许你应该知道,但可以肯定的帮助有它在这个答案指定
Bossan

这对我有用,非常感谢兄弟。我正在使用kafka 2.13
Alejandro Herrera

31

在与Kafka一起工作的过去两个星期中,我一直在目睹相同的问题,并且从那时起一直在阅读此Stackoverflow的帖子。

经过2周的分析,我得出结论,在我的情况下,试图产生不存在的话题的信息时就会发生这种情况

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

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

问候,

卢卡·坦佩里尼(Luca Tampellini)


嗨,卢卡。我也在自动创建新主题。我的问题是,您如何让您的消费者自动发现这个新主题?我的消费者不会这样做。重新启动使用者后,可以接收到新消息,但是导致主题创建的消息丢失了。
jchnxu

15

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

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


8

此警告的另一个可能性(在0.10.2.1中)是,您尝试轮询刚刚创建的主题,并且该主题分区的负责人尚不可用,您正处于领导层选举中。

解决方案是在主题创建和轮询之间等待一秒钟。


6

对于试图在kubernetes上运行kafka并遇到此错误的任何人,这终于为我解决了它:

您必须:

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

要么

  1. 如果使用hostPort,那么你需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet

原因是因为Kafka需要自言自语,并决定使用“公告的”侦听器/主机名来查找自身,而不是使用localhost。即使您有将播发的主机名指向窗格的服务,也无法从窗格中看到它。我真的不知道为什么会这样,但是至少有一种解决方法。

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

2
1.不起作用%错误:本地:主机解析失败:kafka-cluster:9092/1001:无法解析'kafka-cluster:9092':提供的节点名或服务名,或未知
Lu32

我添加了与服务名称相同的主机名,为我工作!
karthikeayan

6

添加此内容可能会帮助其他人。常见问题可能是的配置错误advertised.host.name。使用docker-compose进行Docker设置时,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配置的示例


6

就我而言,它在家里可以正常工作,但是当我连接到办公室网络时,它在办公室中却无法正常工作。

因此将config / server.properties listeners = PLAINTEXT://:9092修改为listeners = PLAINTEXT:// localhost:9092

就我而言,我正在描述消费者群体


他们为什么不设置正确的默认值,这对我有所帮助。
powder366


3

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


3

由于我希望我的kafka经纪人与远程生产者和消费者建立联系,所以我不想advertised.listener被评论。就我而言(在kubernetes上运行kafka),我发现我的kafka pod没有被分配任何集群IP。通过clusterIP: None从services.yml中删除该行,kubernetes将一个内部IP分配给kafka pod。这解决了我的LEADER_NOT_AVAILABLE问题,也解决了kafka生产者/消费者的远程连接问题。


3

当引发LEADER_NOT_AVAILABLE错误时,只需重新启动kafka代理即可:

/bin/kafka-server-stop.sh

其次是

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

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


是。发生在首先启动kafka,然后启动Zookeeper时。
panchicore

我已经做到了,但还不能完全解决。奇怪的是,经纪人确实像领导者一样进行初始化。如在New leader is 0
萨米

2

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


1

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

我错误地遗漏了最后一部分,这使我费了很多时间弄清楚这个LEADER_NOT_AVAILABLE错误的含义。希望这可以帮助某人。


“服务器的私钥”是什么意思?我在服务器密钥库中有CA密钥和已签名的服务器证书,而在客户端信任库中我有CA证书..但仍然出现这些错误..
phaigeim

对不起,我的意思是私钥+证书。我正在建立大型集群,并且在官僚机构链中的某个地方犯了一个错误,因此其中一个证书与CSR不匹配。那可能也是其他原因。仔细检查私钥,证书的md5是否匹配,并且可以使用您的信任库验证该证书。信任库通常包含根证书和中间证书
Vojtmen,2018年

1

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


0

对我来说,这是由于缺少配置
Docker端口(9093)
Kafka命令端口“ bin / kafka-console-producer.sh --broker-list localhost:9092 --topic TopicName”导致的,
我检查了配置以匹配端口和现在一切都很好


0

对我而言,原因是使用了不属于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

0

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

  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>

0

对我来说,我没有为Kafka实例指定经纪人ID。在Docker环境中重新启动时,有时会从zookeeper获得新的ID。如果您的经纪人ID大于1000,则只需指定环境变量KAFKA_BROKER_ID

使用它可以查看代理,主题和分区。

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

0

我知道这是很久以前发布的,我想分享我如何解决它。
由于我有我的办公室笔记本电脑(已配置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
的魅力十足

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.