Leader non disponibile Kafka in Console Producer


172

Sto cercando di usare Kafka.
Tutte le configurazioni sono eseguite correttamente ma quando provo a produrre un messaggio dalla console continuo a ricevere il seguente errore

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

Versione Kafka: 2.11-0.9.0.0


quale versione di kafka stai usando? come fai a sapere che tutte le configurazioni sono corrette? prova ad aggiungere ulteriori informazioni
Nautilus

Sto usando la versione 2.11-0.9.0.0, ho detto che tutte le configurazioni sono corrette perché funzionava.
Vishesh

1
@Vishesh Puoi fornire il risultato del seguente comando ./bin/kafka-topics.sh --zookeeper localhost: 2181 --describe --topic yourTopicName
avr

2
stesso errore anche per me. Sto diventando leader ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --describe --topic yourTopicName ma durante l'invio del messaggio al produttore mantiene l'errore LEADER_NOT_AVAILABLE.
Vilva,

2
Posso confermare questo problema su kafka 2.2.0nel 2019
javadba,

Risposte:


94

Potrebbe essere correlato advertised.host.nameall'impostazione nel tuo server.properties.

Che cosa potrebbe accadere è che il produttore sta cercando di scoprire chi è il leader per una determinata partizione, capisce i suoi advertised.host.namee advertised.porte tenta di connettersi. Se queste impostazioni non sono configurate correttamente, potrebbe pensare che il leader non sia disponibile.


1
Ciò ha risolto l'errore per me .. ma i commenti in server.properties dicono che se non è configurato advertised.host.name utilizzerà host.name. E host.name è stato configurato nel file server.properties.
Spark

Ho avuto lo stesso problema e questo ha funzionato per me per
kafka

3
L'impostazione del mio indirizzo IP anziché del nome host pubblico generato da AWS ha risolto molti problemi.
Spechal,

81

Ho provato tutti i consigli elencati qui. Quello che ha funzionato per me è stato andare su server.propertiese aggiungere:

port = 9092
advertised.host.name = localhost 

Lasciare listenerse advertised_listenerscommentare.


5
soluzione funziona per me ( collegamento della soluzione di vikas ) Voglio solo aggiungere che per me il server.propertiesfile MAC si trova in/usr/local/etc/kafka/
Edison Q

2
ciò che ha funzionato per me è stato questo advertised.listeners=PLAINTEXT://my.ip:9092
Mr. Crowley,

14
NON UTILIZZARE QUESTO - port, advertised.host.namesono configurazioni obsolete. kafka.apache.org/documentation/#brokerconfigs
Stephane

44

Ciò che ha risolto per me è impostare gli ascoltatori in questo modo:

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

Questo fa ascoltare al broker KAFKA tutte le interfacce.


4
Questa dovrebbe essere la risposta accettata. Funziona per la configurazione multi-nodo e ha molto senso.
Piyush Shrivastava,

Possiamo usarlo nel nostro file app.yaml?
Coder

40

Avevo kafka in esecuzione come contenitore Docker e messaggi simili stavano invadendo il registro.
Ed è KAFKA_ADVERTISED_HOST_NAMEstato impostato su "kafka".

Nel mio caso il motivo dell'errore era il /etc/hostsrecord mancante per "kafka" nel contenitore "kafka" stesso.
Quindi, ad esempio, l'esecuzione ping kafkaall'interno del contenitore "kafka" non riuscirebbeping: bad address 'kafka'

In termini di Docker questo problema viene risolto specificando hostnameil contenitore.

Opzioni per raggiungerlo:


Non è una risposta di per sé , ma per riferimento futuro: quando (o se) la finestra mobile / finestra mobile # 1143 è stata risolta, ci sarà un modo semplice per fare riferimento all'host del contenitore, indipendentemente dal sistema operativo utilizzato.
Michael Ahlers,

Se stai usando l'immagine docker wurstmeister / kafka-docker (che è probabilmente la più popolare al momento della stesura di questo scritto), vedi le note qui sull'impostazione di env var e perché
RyanQuey

32

Sto usando kafka_2.12-0.10.2.1:

vi config/server.properties

aggiungi sotto la riga:

listeners=PLAINTEXT://localhost:9092
  • Non c'è bisogno di cambiare le advertised.listeners in quanto raccoglie il valore dalla proprietà listener std.

Nome host e porta che il broker pubblicizzerà per produttori e consumatori. Se non impostato,

  • utilizza il valore per "listener" se configurato

Altrimenti, utilizzerà il valore restituito da java.net.InetAddress.getCanonicalHostName().

fermare il broker Kafka:

bin/kafka-server-stop.sh

riavvia broker:

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

e ora non dovresti vedere alcun problema.


Questo mi ha risolto, la modifica server.propertiesnon è stata sufficiente fino a quando non ho riavviato il broker con un deamon ricaricato. Forse dovresti saperlo, ma sicuramente è stato utile averlo specificato in questa risposta
Bossan,

Questo ha funzionato per me, grazie mille fratello. Sto usandokafka 2.13
Alejandro Herrera il

31

Ho assistito a questo stesso problema nelle ultime 2 settimane mentre lavoravo con Kafka e da allora ho letto questo post di Stackoverflow.

Dopo 2 settimane di analisi ho dedotto che nel mio caso ciò accade quando provo a produrre messaggi su un argomento che non esiste .

Il risultato nel mio caso è che Kafka invia un messaggio di errore ma crea, allo stesso tempo, l'argomento che prima non esisteva. Quindi, se provo a produrre nuovamente un messaggio sull'argomento dopo questo evento, l'errore non verrà più visualizzato come argomento creato.

NOTA BENE: è possibile che la mia particolare installazione di Kafka sia stata configurata per creare automaticamente l'argomento quando lo stesso non esiste; questo dovrebbe spiegare perché nel mio caso posso vedere il problema solo una volta per ogni argomento dopo aver ripristinato gli argomenti: la tua configurazione potrebbe essere diversa e in quel caso continueresti a ricevere lo stesso errore ancora e ancora.

Saluti,

Luca Tampellini


Ciao Luca Sto anche creando automaticamente nuovi argomenti. La mia domanda è: come permetti ai tuoi consumatori di scoprire automaticamente questo nuovo argomento? I miei consumatori non lo faranno. E dopo aver riavviato i miei consumatori, è possibile ricevere nuovi messaggi, ma il messaggio che ha causato la creazione dell'argomento viene perso.
jchnxu,

15

Tendiamo a ricevere questo messaggio quando proviamo a iscriverci a un argomento che non è stato ancora creato. In genere facciamo affidamento sugli argomenti da creare a priori nei nostri ambienti distribuiti, ma abbiamo test dei componenti che vengono eseguiti su un'istanza kafka ancorata, che inizia sempre pulita.

In tal caso, utilizziamo AdminUtils nella nostra configurazione di test per verificare se l'argomento esiste e crearlo in caso contrario. Vedi questo altro overflow dello stack per ulteriori informazioni sulla configurazione di AdminUtils.


8

Un'altra possibilità per questo avvertimento (in 0.10.2.1) è che si tenta di sondare un argomento che è stato appena creato e che il leader di questa partizione di argomenti non è ancora disponibile, si è nel mezzo di un'elezione della leadership.

Attendere un secondo tra la creazione di argomenti e il polling è una soluzione alternativa.


6

Per chiunque cerchi di eseguire kafka su kubernetes e si imbatte in questo errore, questo è ciò che alla fine l'ho risolto per me:

Devi:

  1. Aggiungi hostnamealle specifiche del pod, in questo modo kafka può trovarsi.

o

  1. Se si utilizza hostPort, allora è necessario hostNetwork: trueednsPolicy: ClusterFirstWithHostNet

La ragione di ciò è perché Kafka ha bisogno di parlare con se stesso e decide di usare il listener / hostname "pubblicizzato" per trovarsi, piuttosto che usare localhost. Anche se si dispone di un servizio che punta il nome host pubblicizzato sul pod, non è visibile all'interno del pod. Non so davvero perché sia ​​così, ma almeno c'è una soluzione alternativa.

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. non funziona% ERRORE: locale: errore risoluzione host: cluster kafka: 9092/1001: impossibile risolvere "cluster kafka: 9092": nome nodo o nome servizio fornito o non noto
Lu32

ho aggiunto il nome host come il nome del servizio, lavorando per me!
karthikeayan,

6

Aggiungendo questo poiché può aiutare gli altri. Un problema comune può essere un'errata configurazione di advertised.host.name. Con Docker che utilizza l'impostazione docker-compose, il nome del servizio all'interno KAFKA_ADVERTISED_HOST_NAMEnon funzionerà se non si imposta anche il nome host. docker-compose.ymlesempio:

  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

Quanto sopra senza hostname: kafkapuò emettere un LEADER_NOT_AVAILABLEquando si tenta di connettersi. Puoi trovare un esempio di una docker-composeconfigurazione funzionante qui


6

Nel mio caso, funzionava bene a casa, ma non funzionava in ufficio, nel momento in cui mi collego alla rete dell'ufficio.

Così modificato il config / server.properties ascoltatori = PLAINTEXT: //: 9092 agli ascoltatori = PLAINTEXT: // localhost: 9092

Nel mio caso, stavo ottenendo mentre descrivevo il gruppo di consumatori


Perché diamine non hanno impostato le impostazioni predefinite corrette, questo mi ha aiutato.
powder366

5

Se stai eseguendo kafka sul computer locale, prova ad aggiornare $ KAFKA_DIR / config / server.properties con la riga seguente: listeners=PLAINTEXT://localhost:9092e quindi a riavviare kafka.


come posso fare questo su docker-compose.yml?
AC28,

È possibile utilizzare uno script shell punto di accesso docs.docker.com/compose/compose-file/#entrypoint con docker comporre e sovrascrivere (sed) listener in server.properties.
MrKulli

3

Sto usando docker-compose per costruire il contenitore Kafka usando wurstmeister/kafkaimage. L'aggiunta di KAFKA_ADVERTISED_PORT: 9092proprietà al mio docker-composefile ha risolto questo errore per me.


3

Dal momento che volevo che il mio broker kafka si connettesse con produttori e consumatori remoti, quindi non voglio advertised.listeneressere commentato. Nel mio caso, (eseguendo kafka su kubernetes), ho scoperto che al mio pod kafka non è stato assegnato alcun IP cluster. Rimuovendo la linea clusterIP: Noneda services.yml, kubernetes assegna un IP interno al pod di kafka. Ciò ha risolto il mio problema di LEADER_NOT_AVAILABLE e anche la connessione remota di produttori / consumatori di kafka.


3

Quando viene generato l'errore LEADER_NOT_AVAILABLE, riavvia semplicemente il broker kafka:

/bin/kafka-server-stop.sh

seguito da

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

(Nota: Zookeeper deve essere in esecuzione a questo punto, se lo fai altrimenti non funzionerà)


sì. succede quando kafka viene avviato per primo e dopo Zookeeper.
Panchicore

L'ho fatto e non lo risolve del tutto. Ciò che è strano è che il broker si inizializza come se fosse il leader. come in New leader is 0.
Sammy,

2

Questo sotto riga che ho aggiunto config/server.properties, ha risolto il mio problema simile al problema precedente. Spero che questo aiuti, è praticamente ben documentato nel file server.properties, prova a leggere e capire prima di modificarlo. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Per tutti coloro che lottano con l'installazione di Kafka ssl e vedono questo errore LEADER_NOT_AVAILABLE. Uno dei motivi che potrebbero essere interrotti è il keystore e il truststore. Nel keystore è necessario disporre della chiave privata del server + certificato del server firmato. Nel truststore del client, è necessario disporre del certificato CA intermedio in modo che il client possa autenticare il server kafka. Se utilizzerai ssl per la comunicazione interbroker, avrai bisogno che questo truststore sia impostato anche in server.properties dei broker in modo che possano autenticarsi a vicenda.

L'ultimo pezzo mi mancava per errore e mi ha causato molte ore dolorose per scoprire cosa potrebbe significare questo errore LEADER_NOT_AVAILABLE. Spero che questo possa aiutare qualcuno.


Cosa intendi con "chiave privata del server"? Ho una chiave CA e un certificato server firmato nel keystore del server, mentre nel truststore client ho un certificato CA .. Ma sto ancora ricevendo questi errori ..
phaigeim

Spiacente, intendevo chiave privata + certificato. Stavo installando un grande cluster e da qualche parte nella catena della burocrazia ho commesso un errore, quindi uno dei certificati non corrispondeva alla CSR. Potrebbe essere anche un'altra ragione. Controlla che md5 di chiave privata, corrispondenze di certificati e tale certificato possano essere verificati con il tuo truststore. Truststore contiene in genere certificati di root e intermedi
vojtmen,

1

Il problema viene risolto dopo aver aggiunto l'impostazione del listener sul file server.properties situato nella directory di configurazione. ascoltatori = PLAINTEXT: // localhost (o il tuo server): 9092 Riavvia kafka dopo questa modifica. Versione utilizzata 2.11


0

Per me, è successo a causa di una mancata configurazione
Docker port (9093)
Porta comandi Kafka "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
Ho controllato la mia configurazione per abbinare la porta e ora va tutto bene


0

Per me, la causa stava usando uno Zookeeper specifico che non faceva parte del pacchetto Kafka. Quel Zookeeper era già installato sulla macchina per altri scopi. Apparentemente Kafka non funziona con qualsiasi Zookeeper. Il passaggio allo Zookeeper fornito con Kafka lo ha risolto per me. Per non entrare in conflitto con lo Zookeeper esistente, ho dovuto modificare la mia configurazione per fare in modo che Zookeeper ascoltasse su una porta diversa:

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

0

Gli ascoltatori pubblicizzati come menzionato nelle risposte sopra potrebbero essere uno dei motivi. Le altre possibili ragioni sono:

  1. L'argomento potrebbe non essere stato creato. Puoi verificarlo usandobin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Controlla i server bootstrap che hai dato al produttore per recuperare i metadati. Se il server bootstrap non contiene i metadati più recenti sull'argomento (ad esempio, quando ha perso la sua richiesta zookeeper). Devi aggiungere più di un server bootstrap.

Inoltre, assicurati di avere impostato il listener pubblicizzato IP:9092anziché localhost:9092. Quest'ultimo significa che il broker è accessibile solo tramite localhost.

Quando ho riscontrato l'errore, ricordo di aver utilizzato PLAINTEXT://<ip>:<PORT>l'elenco dei server bootstrap (o l'elenco dei broker) e ha funzionato, stranamente.

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

0

Per me, non ho specificato l'ID broker per l'istanza di Kafka. Otterrà un nuovo ID dallo zookeeper a volte quando si riavvia nell'ambiente Docker. Se l'ID del broker è maggiore di 1000, basta specificare la variabile di ambienteKAFKA_BROKER_ID .

Usa questo per vedere broker, argomenti e partizioni.

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

0

so che questo è stato pubblicato molto tempo fa, vorrei condividere come l'ho risolto.
da quando ho il mio laptop da ufficio ( VPN e proxy sono stati configurati).
ho controllato la variabile di ambiente NO_PROXY

> echo %NO_PROXY%

è tornato con valori vuoti
ora ho impostato NO_PROXY con localhost e 127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

se si desidera aggiungere a valori esistenti, quindi

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

dopo questo, ho riavviato Zookeeper e Kafka ha
funzionato come un fascino

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.