web-dev-qa-db-fra.com

Leader non disponible dans le producteur de console

J'essaie d'utiliser Kafka. Toutes les configurations sont faites correctement, mais lorsque j'essaie de produire un message depuis la console, l'erreur continue

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

version de kafka: 2.11-0.9.0.0

Quelqu'un peut-il s'il vous plaît aider car je suis incapable de trouver une solution n'importe où?

102
Vishesh

Cela pourrait être lié au réglage de advertised.Host.name dans votre server.properties.

Ce qui pourrait arriver, c’est que votre producteur essaie de savoir qui est le chef de file d’une partition donnée, détermine ses advertised.Host.name et advertised.port et tente de se connecter . Si ces paramètres ne sont pas configurés correctement, il est alors possible que le chef soit considéré comme tel. indisponible.

67
Alexey Raga

J'ai essayé toutes les recommandations énumérées ici. Ce qui a fonctionné pour moi a été d'aller à server.properties et d'ajouter:

port = 9092
advertised.Host.name = localhost 

Laissez listeners et advertised_listeners commentés.

51
Vikas Deolaliker

Kafka fonctionnait en tant que conteneur Docker et des messages similaires inondaient le journal.
Et KAFKA_ADVERTISED_Host_NAME a été réglé sur 'kafka'. 

Dans mon cas, la raison de l'erreur était l'enregistrement /etc/hosts manquant pour 'kafka' dans le conteneur 'kafka' lui-même.
Ainsi, par exemple, exécuter ping kafka dans le conteneur 'kafka' échouerait avec ping: bad address 'kafka' 

En termes de Docker, ce problème est résolu en spécifiant hostname pour le conteneur. 

Options pour y parvenir: 

34
Vlad.Bachurin

Ce qui a résolu le problème pour moi est de définir les auditeurs comme suit:

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

Cela fait que KAFKA broker écoute toutes les interfaces.

26
Pinelopi Kouleri

J'utilise kafka_2.12-0.10.2.1:

vi config/server.properties

ajouter la ligne ci-dessous:

listeners=PLAINTEXT://localhost:9092
  • Il n'est pas nécessaire de changer le fichier advertised.listeners car il prend la valeur.

Le nom d'hôte et le portage du courtier feront la publicité auprès des producteurs et des consommateurs. Si non défini, 

  • il utilise la valeur pour "listeners" s'il est configuré

. Sinon, il utilisera la valeur renvoyée par Java.net.InetAddress.getCanonicalHostName ().

arrêtez le courtier Kafka:

bin/kafka-server-stop.sh

redémarrage du courtier:

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

et maintenant vous ne devriez voir aucun problème.

12
Dean Jain

Nous avons tendance à recevoir ce message lorsque nous essayons de souscrire à un sujet qui n'a pas encore été créé. Nous comptons généralement sur les sujets à créer a priori dans nos environnements déployés, mais nous avons des tests de composants qui s'exécutent sur une instance kafka dockérisée, qui démarre en mode minimal à chaque fois. 

Dans ce cas, nous utilisons AdminUtils dans notre configuration de test pour vérifier si le sujet existe et le créer sinon. Voir ceci other stack overflow pour plus d’informations sur la configuration d’AdminUtils.

9
Ryan McKay

Une autre possibilité pour cet avertissement (dans 0.10.2.1) est que vous essayez d'interroger un sujet qui vient d'être créé et que le chef de file pour cette partition de sujets ne soit pas encore disponible, vous êtes au milieu d'une élection à la direction.

Attendre une seconde entre la création du sujet et l'interrogation est une solution de contournement.

7
Benoit Delbosc

J'ai été témoin de ce problème au cours des deux dernières semaines alors que je travaillais avec Kafka et lis depuis ce billet sur Stackoverflow.

Après 2 semaines d’analyse, j’en ai déduit que dans mon cas cela se produit en essayant de produire des messages sur un sujet qui n'existe pas

Le résultat dans mon cas est que Kafka envoie un message d'erreur mais crée, au même moment, le sujet qui n'existait pas auparavant. Donc, si j'essaie de produire à nouveau un message sur ce sujet après cet événement, l'erreur n'apparaîtra plus car le sujet a été créé.

VEUILLEZ NOTER: Il est possible que mon installation de Kafka ait été configurée pour créer automatiquement le sujet au cas où il n’existerait pas. être différent et dans ce cas, vous auriez toujours la même erreur.

Cordialement,

Luca Tampellini

7
Luca Tampellini

Pour ceux qui essaient de lancer kafka sur kubernetes et qui rencontrent cette erreur, voici ce qui a finalement été résolu pour moi:

Vous devez soit:

  1. Ajoutez hostname à la spécification du pod, ainsi kafka pourra se retrouver.

ou

  1. Si vous utilisez hostPort, alors vous avez besoin de hostNetwork: true et dnsPolicy: ClusterFirstWithHostNet

La raison en est que Kafka doit se parler à lui-même et décide d'utiliser le nom d'écouteur/annonceur "annoncé" pour se retrouver lui-même, plutôt que d'utiliser localhost . la nacelle, elle n'est pas visible de l'intérieur de la nacelle. Je ne sais pas vraiment pourquoi c'est le cas, mais au moins il existe une solution de contournement.

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
6
Chris

Ajouter ceci car cela peut aider les autres. Un problème courant peut être une mauvaise configuration de advertised.Host.name. Lorsque Docker utilise docker-compose, le nom du service dans KAFKA_ADVERTISED_Host_NAME ne fonctionnera que si vous définissez également le nom d’hôte. docker-compose.yml exemple:

  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

Ce qui précède sans hostname: kafka peut émettre un LEADER_NOT_AVAILABLE lors d’une tentative de connexion . Vous pouvez trouver un exemple d’une configuration docker-compose en fonctionnement ici

4
Paizo

J'utilise docker-compose pour construire le conteneur Kafka en utilisant wurstmeister/kafka image. L'ajout de la propriété KAFKA_ADVERTISED_PORT: 9092 à mon fichier docker-compose a résolu cette erreur pour moi.

2
Priyanka

Puisque je voulais que mon courtier kafka communique avec des producteurs et des consommateurs éloignés, je ne souhaite donc pas que advertised.listener soit commenté. Dans mon cas, (exécuter kafka sur kubernetes), j'ai découvert que mon pod kafka n'avait reçu aucune adresse IP de cluster. En supprimant la ligne clusterIP: None de services.yml, le kubernetes attribue une adresse IP interne à kafka pod. Ceci a résolu mon problème de LEADER_NOT_AVAILABLE et également la connexion à distance des producteurs/consommateurs de kafka. 

2
Anum Sheraz

Dans mon cas, ça fonctionnait bien à la maison, mais ça échouait au bureau, au moment où je me connectais au réseau du bureau.

Donc modifié le fichier config/server.properties Listeners = PLAINTEXT: //: 9092 à listeners = PLAINTEXT: // localhost: 9092

Dans mon cas, je devenais en décrivant le groupe de consommateurs

1
Yoga Gowda

Cette ligne ci-dessous, j’ai ajouté dans config/server.properties, qui a résolu le même problème que précédemment. J'espère que cela vous aidera, c'est assez bien documenté dans le fichier server.properties, essayez de lire et de comprendre avant de modifier ceci .advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

1
ravibeli

Pour tous ceux qui ont des difficultés avec la configuration de Kafka ssl et qui voient cette erreur LEADER_NOT_AVAILABLE. Le magasin de clés et le magasin de clés de confiance constituent l’une des raisons pouvant être endommagées. Dans le magasin de clés, vous devez disposer de la clé privée du serveur et du certificat de serveur signé. Dans le magasin de clés de confiance du client, vous devez disposer d'un certificat d'intermédiaire CA afin que le client puisse authentifier le serveur Kafka. Si vous utilisez ssl pour les communications entre courtiers, vous devez définir ce fichier de clés de confiance également dans le fichier server.properties des courtiers afin qu'ils puissent s'authentifier mutuellement.

Ce dernier article me manquait par erreur et m'a causé de nombreuses heures pénibles à découvrir le sens de cette erreur LEADER_NOT_AVAILABLE. J'espère que cela peut aider quelqu'un.

1
vojtmen

Lorsque l'erreur LEADER_NOT_AVAILABLE se déclenche, redémarrez simplement le courtier kafka:

/bin/kafka-server-stop.sh

suivi par 

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

(Remarque: Zookeeper doit être lancé à ce moment-là, sinon, ça ne marchera pas)

1
Dan

Le problème est résolu après l'ajout du paramètre d'écoute dans le fichier server.properties situé dans le répertoire config. listeners = PLAINTEXT: // localhost (ou votre serveur): 9092 Redémarrez kafka après cette modification. Version utilisée 2.11

1
Jitray

Pour moi, la cause utilisait un Zookeeper spécifique qui ne faisait pas partie du package Kafka. Ce Zookeeper était déjà installé sur la machine à d'autres fins. Apparemment, Kafka ne fonctionne pas avec n'importe quel gardien de zoo. Le passage à la gardienne de zoo fournie avec Kafka l'a résolu pour moi. Pour ne pas entrer en conflit avec le Zookeeper existant, j'ai dû modifier ma configuration pour que le Zookeeper écoute sur un autre port:

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

Pour moi, c'était dû à une configuration manquante
Port Docker (9093)
Port de commande Kafka "bin/kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
J'ai vérifié ma configuration pour faire correspondre le port et maintenant tout va bien

0
guillaume verneret

Les auditeurs annoncés mentionnés dans les réponses ci-dessus pourraient en être l’une des raisons. Les autres raisons possibles sont:

  1. Le sujet n'a peut-être pas été créé. Vous pouvez vérifier ceci en utilisant _bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>_
  2. Vérifiez vos serveurs bootstrap que vous avez fournis au producteur pour récupérer les métadonnées. Si le serveur bootstrap ne contient pas les dernières métadonnées sur le sujet (par exemple, lorsqu'il a perdu sa revendication zookeeper). Vous devez ajouter plusieurs serveurs bootstrap.

Assurez-vous également que l'écouteur annoncé est défini sur _IP:9092_ au lieu de _localhost:9092_. Ce dernier signifie que le courtier n'est accessible que par le biais de l'hôte local.

Lorsque j'ai rencontré l'erreur, je me souviens d'avoir utilisé PLAINTEXT://<ip>:<PORT> dans la liste des serveurs bootstrap (et la liste des courtiers) et cela a fonctionné étrangement.

_bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>
_
0
JavaTechnical

J'ai eu le même problème aujourd'hui. Ce que j'ai fait pour contourner cette erreur est de faire une modification subtile dans le fichier /etc/hosts:

Remplacez la ligne 127.0.0.1 localhost localhost.localdomain par 10.0.11.12 localhost localhost.localdomain

(Supposons que 10.0.11.12 est l'une des adresses IP de votre hôte sur laquelle le serveur Kafka écoute.)

0
Minh Danh

Si vous exécutez kafka sur une machine locale, essayez de mettre à jour $ KAFKA_DIR/config/server.properties avec la ligne ci-dessous: listeners=PLAINTEXT://localhost:9092 puis redémarrez kafka.

0
MrKulli