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ù?
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.
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.
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:
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.
J'utilise kafka_2.12-0.10.2.1:
vi config/server.properties
ajouter la ligne ci-dessous:
listeners=PLAINTEXT://localhost:9092
Le nom d'hôte et le portage du courtier feront la publicité auprès des producteurs et des consommateurs. Si non défini,
. 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.
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.
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.
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
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:
hostname
à la spécification du pod, ainsi kafka pourra se retrouver.ou
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
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
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.
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.
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
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
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.
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)
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
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
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
Les auditeurs annoncés mentionnés dans les réponses ci-dessus pourraient en être l’une des raisons. Les autres raisons possibles sont:
bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
_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>
_
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.)
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.