Leader nicht verfügbar Kafka in Console Producer


171

Ich versuche Kafka zu benutzen.
Alle Konfigurationen werden ordnungsgemäß durchgeführt, aber wenn ich versuche, eine Nachricht von der Konsole zu erstellen, wird immer wieder der folgende Fehler angezeigt

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

Kafka-Version: 2.11-0.9.0.0


Welche Version von Kafka verwenden Sie? Woher wissen Sie, dass alle Konfigurationen korrekt sind? Bitte versuchen Sie weitere Informationen hinzuzufügen
Nautilus

Ich verwende die Version 2.11-0.9.0.0. Ich sagte, dass alle Konfigurationen korrekt sind, weil sie funktionieren.
Vishesh

1
@Vishesh Können Sie das Ergebnis des folgenden Befehls angeben ./bin/kafka-topics.sh --zookeeper localhost: 2181 --describe --topic yourTopicName
avr

2
der gleiche Fehler auch für mich. Ich erhalte den Anführer ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --describe --topic yourTopicName, aber beim Senden einer Nachricht an den Produzenten wird weiterhin der Fehler LEADER_NOT_AVAILABLE ausgegeben.
Vilva

2
Ich kann dieses Problem auf Kafka 2.2.0im Jahr 2019 bestätigen
Javadba

Antworten:


91

Es könnte mit der advertised.host.nameEinstellung in Ihrem zusammenhängen server.properties.

Was passieren könnte, ist, dass Ihr Produzent versucht herauszufinden, wer der Anführer für eine bestimmte Partition ist, deren advertised.host.nameund herausfindet advertised.portund versucht, eine Verbindung herzustellen. Wenn diese Einstellungen nicht richtig konfiguriert sind, wird möglicherweise angenommen, dass der Leader nicht verfügbar ist.


1
Das hat den Fehler für mich behoben. Die Kommentare in server.properties besagen jedoch, dass host.name verwendet wird, wenn der angekündigte Hostname nicht konfiguriert ist. Und der host.name wurde in der Datei server.properties konfiguriert.
Herr Spark

Ich habe das gleiche Problem und dies funktionierte für mich für kafka 0.9
minhas23

3
Durch Festlegen dieser IP-Adresse anstelle des von AWS generierten öffentlichen Hostnamens wurden viele Probleme behoben, die ich hatte.
Spechal

80

Ich habe alle hier aufgeführten Empfehlungen ausprobiert. Was für mich funktionierte, war zu gehen server.propertiesund hinzuzufügen:

port = 9092
advertised.host.name = localhost 

Geh listenersund advertised_listenerskommentiere aus.


5
Lösung funktioniert für mich ( vikas 'Lösungslink ) Ich möchte nur hinzufügen, dass sich die MAC- server.propertiesDatei für mich um/usr/local/etc/kafka/
Edison Q

2
Was für mich funktionierte war das advertised.listeners=PLAINTEXT://my.ip:9092
Mr. Crowley

14
VERWENDEN SIE DIESES NICHT - port, advertised.host.namesind veraltete Konfigurationen. kafka.apache.org/documentation/#brokerconfigs
Stephane

44

Was es für mich gelöst hat, ist, die Zuhörer so einzustellen:

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

Dadurch hört der KAFKA-Broker alle Schnittstellen ab.


4
Dies sollte die akzeptierte Antwort sein. Funktioniert für die Konfiguration mehrerer Knoten und ist sehr sinnvoll.
Piyush Shrivastava

Können wir dies in unserer Datei app.yaml verwenden?
Coder

40

Ich hatte Kafka als Docker-Container ausgeführt und ähnliche Nachrichten fluteten in das Protokoll.
Und KAFKA_ADVERTISED_HOST_NAMEwurde auf 'kafka' gesetzt.

In meinem Fall war der Grund für den Fehler der fehlende /etc/hostsDatensatz für 'kafka' im 'kafka'-Container selbst.
So würde beispielsweise das Ausführen ping kafkain einem 'kafka'-Container mit fehlschlagenping: bad address 'kafka'

In Bezug auf Docker wird dieses Problem durch Angabe hostnamedes Containers gelöst .

Optionen, um dies zu erreichen:


Es ist keine Antwort an sich , aber als zukünftige Referenz: Wenn (oder wenn) Docker / Docker # 1143 aufgelöst ist, gibt es eine einfache Möglichkeit, auf den Host des Containers zu verweisen - unabhängig davon, welches Betriebssystem verwendet wird.
Michael Ahlers

Wenn Sie das wurstmeister / kafka-docker-Docker- Bild verwenden (das zum Zeitpunkt dieses Schreibens wahrscheinlich das beliebteste ist),
lesen Sie

32

Ich benutze kafka_2.12-0.10.2.1:

vi config/server.properties

füge folgende Zeile hinzu:

listeners=PLAINTEXT://localhost:9092
  • Es ist nicht erforderlich, die beworbenen Listener zu ändern, da sie den Wert aus der Eigenschaft std listener übernehmen.

Hostname und Port, die der Broker Herstellern und Verbrauchern bekannt macht. Wenn nicht eingestellt,

  • Es verwendet den Wert für "Listener", falls konfiguriert

Andernfalls wird der von zurückgegebene Wert verwendet java.net.InetAddress.getCanonicalHostName().

Stoppen Sie den Kafka-Broker:

bin/kafka-server-stop.sh

Broker neu starten:

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

und jetzt sollten Sie keine Probleme sehen.


Dies löste es für mich, Änderungen server.propertieswaren nicht genug, bis ich den Broker mit einem neu geladenen Deamon neu startete. Vielleicht solltest du das wissen, aber es hat sicher geholfen, dass es in dieser Antwort angegeben wurde
Bossan

Das hat bei mir funktioniert, vielen Dank, Bruder. Ich benutzekafka 2.13
Alejandro Herrera

31

Ich habe dieses Problem in den letzten 2 Wochen bei der Arbeit mit Kafka gesehen und seitdem den Beitrag dieses Stackoverflow gelesen.

Nach zweiwöchiger Analyse habe ich festgestellt, dass dies in meinem Fall passiert, wenn versucht wird, Nachrichten zu einem Thema zu erstellen, das nicht existiert .

Das Ergebnis in meinem Fall ist, dass Kafka eine Fehlermeldung zurücksendet, aber gleichzeitig das Thema erstellt, das vorher nicht existierte. Wenn ich also nach diesem Ereignis erneut versuche, eine Nachricht zu diesem Thema zu erstellen, wird der Fehler nicht mehr als das erstellte Thema angezeigt.

BITTE BEACHTEN SIE: Es kann sein, dass meine spezielle Kafka-Installation so konfiguriert wurde, dass das Thema automatisch erstellt wird, wenn dasselbe nicht vorhanden ist. Das sollte erklären, warum in meinem Fall das Problem nach dem Zurücksetzen der Themen nur einmal für jedes Thema angezeigt wird: Ihre Konfiguration ist möglicherweise anders, und in diesem Fall wird immer wieder derselbe Fehler angezeigt.

Grüße,

Luca Tampellini


Hallo Luca. Ich erstelle auch automatisch neue Themen. Meine Frage ist, wie Sie Ihre Verbraucher dieses neue Thema automatisch entdecken lassen können. Meine Verbraucher werden es nicht tun. Und nachdem ich meine Kunden neu gestartet habe, können neue Nachrichten empfangen werden, aber die Nachricht, die die Themenerstellung verursacht hat, geht verloren.
Jchnxu

15

Wir erhalten diese Nachricht in der Regel, wenn wir versuchen, ein Thema zu abonnieren, das noch nicht erstellt wurde. Wir verlassen uns im Allgemeinen darauf, dass Themen in unseren bereitgestellten Umgebungen a priori erstellt werden. Wir haben jedoch Komponententests, die für eine dockerisierte Kafka-Instanz ausgeführt werden, die jedes Mal sauber gestartet wird.

In diesem Fall verwenden wir AdminUtils in unserem Test-Setup, um zu überprüfen, ob das Thema vorhanden ist, und um es zu erstellen, wenn nicht. Weitere Informationen zum Einrichten von AdminUtils finden Sie in diesem anderen Stapelüberlauf.


8

Eine andere Möglichkeit für diese Warnung (in 0.10.2.1) besteht darin, dass Sie versuchen, ein gerade erstelltes Thema abzufragen, und der Leiter für diese Themenaufteilung noch nicht verfügbar ist. Sie befinden sich mitten in einer Führungswahl.

Das Warten einer Sekunde zwischen der Erstellung des Themas und dem Abrufen ist eine Problemumgehung.


6

Für alle, die versuchen, kafka auf kubernetes auszuführen und auf diesen Fehler stoßen, ist dies das, was es für mich endgültig gelöst hat:

Sie müssen entweder:

  1. Fügen Sie hostnameder Pod-Spezifikation hinzu, so kann sich kafka selbst finden.

oder

  1. Wenn Sie verwenden hostPort, benötigen Sie hostNetwork: trueunddnsPolicy: ClusterFirstWithHostNet

Der Grund dafür ist, dass Kafka mit sich selbst sprechen muss und beschließt, den 'beworbenen' Listener / Hostnamen zu verwenden, um sich selbst zu finden, anstatt localhost zu verwenden. Selbst wenn Sie einen Dienst haben, der den angekündigten Hostnamen auf den Pod verweist, ist er im Pod nicht sichtbar. Ich weiß nicht genau, warum das so ist, aber es gibt zumindest eine Problemumgehung.

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. funktioniert nicht% FEHLER: Lokal: Fehler bei der Hostauflösung: kafka-cluster: 9092/1001: Fehler beim Auflösen von 'kafka-cluster: 9092': Knotenname oder Servname angegeben oder nicht bekannt
Lu32

Ich habe den gleichen Hostnamen wie den Dienstnamen hinzugefügt und arbeite für mich!
Karthikeayan

6

Fügen Sie dies hinzu, da es anderen helfen kann. Ein häufiges Problem kann eine Fehlkonfiguration von sein advertised.host.name. Wenn Docker Docker-Compose verwendet, KAFKA_ADVERTISED_HOST_NAMEfunktioniert das Festlegen des Namens des Dienstes im Inneren nur , wenn Sie auch den Hostnamen festlegen. docker-compose.ymlBeispiel:

  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

Das obige ohne hostname: kafkakann LEADER_NOT_AVAILABLEbeim Versuch, eine Verbindung herzustellen, ein Problem darstellen . Ein Beispiel für eine funktionierende docker-composeKonfiguration finden Sie hier


6

In meinem Fall funktionierte es zu Hause einwandfrei, aber im Büro schlug es fehl, sobald ich mich mit dem Büronetzwerk verband.

Ändern Sie daher die Listener config / server.properties = PLAINTEXT: //: 9092 in listeners = PLAINTEXT: // localhost: 9092

In meinem Fall bekam ich während der Beschreibung der Verbrauchergruppe


Warum zum Teufel setzen sie nicht die richtigen Standardeinstellungen, das hat mir geholfen.
Pulver366

5

Wenn Sie kafka auf einem lokalen Computer ausführen, aktualisieren Sie $ KAFKA_DIR / config / server.properties mit der folgenden Zeile: listeners=PLAINTEXT://localhost:9092und starten Sie kafka neu.


Wie mache ich das auf docker-compose.yml?
AC28

Sie können ein Einstiegspunkt-Shell-Skript docs.docker.com/compose/compose-file/#entrypoint mit Docker Compose verwenden und Listener in server.properties überschreiben (sed).
MrKulli

3

Ich verwende Docker-Compose, um den Kafka-Container mithilfe von wurstmeister/kafkaImage zu erstellen . Das Hinzufügen von KAFKA_ADVERTISED_PORT: 9092Eigenschaften zu meiner docker-composeDatei hat diesen Fehler für mich behoben.


3

Da ich wollte, dass mein Kafka-Broker mit Remote-Produzenten und -Konsumenten in Verbindung steht, möchte ich nicht auskommentiert advertised.listenerwerden. In meinem Fall (Kafka auf Kubernetes ausführen) stellte ich fest, dass meinem Kafka-Pod keine Cluster-IP zugewiesen wurde. Durch Entfernen der Zeile clusterIP: Noneaus services.yml weisen die kubernetes dem kafka pod eine interne IP zu. Dies löste mein Problem mit LEADER_NOT_AVAILABLE und auch die Fernverbindung von Kafka-Produzenten / Konsumenten.


3

Wenn der Fehler LEADER_NOT_AVAILABLE ausgelöst wird, starten Sie einfach den kafka-Broker neu:

/bin/kafka-server-stop.sh

gefolgt von

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

(Hinweis: Zookeeper muss zu diesem Zeitpunkt ausgeführt werden, wenn Sie dies nicht tun, funktioniert es nicht.)


Ja. passiert, wenn kafka zuerst gestartet wird und zookeeper danach.
Panchicore

Ich habe das getan und es löst es nicht ganz. Was seltsam ist, ist, dass der Broker initialisiert, als ob er der Anführer wäre. wie in New leader is 0.
Sammy

2

Diese folgende Zeile habe ich hinzugefügt config/server.properties, die mein Problem ähnlich wie oben behoben hat. Ich hoffe, dies hilft, es ist ziemlich gut in der Datei server.properties dokumentiert. Versuchen Sie zu lesen und zu verstehen, bevor Sie dies ändern. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Für alle, die mit dem Kafka ssl-Setup zu kämpfen haben und diesen LEADER_NOT_AVAILABLE-Fehler sehen. Einer der Gründe, die möglicherweise beschädigt werden, ist der Keystore und der Truststore. Im Keystore benötigen Sie einen privaten Schlüssel des Servers + ein signiertes Serverzertifikat. Im Client-Truststore benötigen Sie ein CA-Zwischenzertifikat, damit der Client den Kafka-Server authentifizieren kann. Wenn Sie ssl für die Interbroker-Kommunikation verwenden, muss dieser Truststore auch in den server.properties der Broker festgelegt sein, damit sie sich gegenseitig authentifizieren können.

Das letzte Stück, das mir fälschlicherweise fehlte, verursachte mir viele schmerzhafte Stunden, als ich herausfand, was dieser LEADER_NOT_AVAILABLE-Fehler bedeuten könnte. Hoffentlich kann das jemandem helfen.


Was meinst du mit "privater Schlüssel des Servers"? Ich habe CA-Schlüssel und signiertes Serverzertifikat im Server-Keystore, während ich im Client-Truststore CA-Zertifikat habe. Aber ich
erhalte

Entschuldigung, ich meinte privaten Schlüssel + Zertifikat. Ich habe einen großen Cluster aufgebaut und irgendwo in der Bürokratiekette einen Fehler gemacht, sodass eines der Zertifikate nicht mit CSR übereinstimmt. Das könnte auch ein anderer Grund sein. Stellen Sie sicher, dass md5 des privaten Schlüssels, der Zertifikatsübereinstimmungen und des Zertifikats mit Ihrem Truststore überprüft werden kann. Truststore enthält normalerweise Root- und Intermediate-Zertifikate
vojtmen

1

Das Problem wurde behoben, nachdem die Listener-Einstellung in der Datei server.properties im Konfigurationsverzeichnis hinzugefügt wurde. listeners = PLAINTEXT: // localhost (oder Ihr Server): 9092 Starten Sie kafka nach dieser Änderung neu. Verwendete Version 2.11


0

Für mich war es aufgrund einer Fehlkonfiguration passieren
Docker - Port (9093)
Kafka Befehl port „bin / kafka-console-producer.sh --broker-Liste localhost: 9092 --topic topicname“
überprüfte ich meine Konfiguration Port und jetzt ist alles gut


0

Für mich war die Ursache die Verwendung eines bestimmten Zookeepers, der nicht Teil des Kafka-Pakets war. Dieser Zookeeper wurde bereits für andere Zwecke auf dem Computer installiert. Anscheinend arbeitet Kafka nicht mit irgendeinem Zookeeper. Der Wechsel zu dem mit Kafka gelieferten Zookeeper löste das Problem für mich. Um nicht mit dem vorhandenen Zookeeper in Konflikt zu geraten, musste ich meine Konfiguration ändern, damit der Zookeeper einen anderen Port überwacht:

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

0

Die beworbenen Zuhörer, wie in den obigen Antworten erwähnt, könnten einer der Gründe sein. Die anderen möglichen Gründe sind:

  1. Das Thema wurde möglicherweise nicht erstellt. Sie können dies mit überprüfenbin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Überprüfen Sie Ihre Bootstrap-Server, die Sie dem Produzenten zum Abrufen der Metadaten gegeben haben. Wenn der Bootstrap-Server nicht die neuesten Metadaten zum Thema enthält (z. B. wenn er seinen Zookeeper-Anspruch verloren hat). Sie müssen mehr als einen Bootstrap-Server hinzufügen.

Stellen Sie außerdem sicher, dass Sie den angekündigten Listener auf IP:9092anstatt eingestellt haben localhost:9092. Letzteres bedeutet, dass der Broker nur über den localhost erreichbar ist.

Als ich auf den Fehler stieß, erinnere ich mich, dass ich ihn PLAINTEXT://<ip>:<PORT>in der Liste der Bootstrap-Server (oder der Broker-Liste) verwendet habe und er seltsamerweise funktioniert hat.

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

0

Für mich habe ich keine Broker-ID für die Kafka-Instanz angegeben. Es wird manchmal eine neue ID von zookeeper erhalten, wenn es in der Docker-Umgebung neu gestartet wird. Wenn Ihre Broker-ID größer als 1000 ist, geben Sie einfach die Umgebungsvariable an KAFKA_BROKER_ID.

Verwenden Sie diese Option, um Broker, Themen und Partitionen anzuzeigen.

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

0

Ich weiß, dass dies vor langer Zeit gepostet wurde. Ich möchte mitteilen, wie ich es gelöst habe.
da ich meinen Office-Laptop habe ( VPN und Proxy wurden konfiguriert).
Ich habe die Umgebungsvariable NO_PROXY überprüft

> echo %NO_PROXY%

es gab mit leeren Werten zurück,
jetzt habe ich das NO_PROXY mit localhost und 127.0.0.1 gesetzt

> set NO_PROXY=127.0.0.1,localhost  

Wenn Sie an vorhandene Werte anhängen möchten, dann

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

Danach habe ich Zookeeper neu gestartet und Kafka
hat wie ein Zauber funktioniert

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.