Líder no disponible Kafka en Console Producer

172

Estoy tratando de usar Kafka.
Todas las configuraciones se realizan correctamente, pero cuando trato de generar un mensaje desde la consola sigo recibiendo el siguiente error

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

Versión Kafka: 2.11-0.9.0.0

Vishesh
fuente
¿Qué versión de kafka estás usando? ¿Cómo sabes que todas las configuraciones son correctas? intente agregar más información
Nautilus
Estoy usando la versión 2.11-0.9.0.0, dije que todas las configuraciones son correctas porque estaba funcionando.
Vishesh
1
@Vishesh ¿Puede proporcionar el resultado del siguiente comando ./bin/kafka-topics.sh --zookeeper localhost: 2181 --describe --topic yourTopicName
avr
2
El mismo error para mí también. Estoy obteniendo líder ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --describe --topic yourTopicName pero al enviar un mensaje al productor mantiene el error LEADER_NOT_AVAILABLE.
Vilva
2
Puedo confirmar este problema en kafka 2.2.0en 2019
javadba

Respuestas:

94

Podría estar relacionado con la advertised.host.nameconfiguración en su server.properties.

Lo que podría suceder es que el productor está tratando de averiguar quién es el líder de una partición determinada, las cifras de sus advertised.host.namee advertised.portintentos y conectar. Si estos ajustes no están configurados correctamente, puede pensar que el líder no está disponible.

Alexey Raga
fuente
1
Eso solucionó el error para mí ... pero los comentarios en server.properties dicen que si advertised.host.name no está configurado, usará host.name. Y el host.name se configuró en el archivo server.properties.
Mr Spark
Tuve el mismo problema y esto funcionó para mí para kafka 0.9
minhas23
3
Establecer esto en mi dirección IP en lugar del nombre de host público generado por AWS resolvió muchos problemas que tenía.
Spechal
81

Intenté todas las recomendaciones enumeradas aquí. Lo que funcionó para mí fue ir server.propertiesy agregar:

port = 9092
advertised.host.name = localhost 

Salir listenersy advertised_listenerscomentado.

Vikas Deolaliker
fuente
55
la solución funciona para mí ( enlace de solución de vikas ) Solo quiero agregar eso para mí en MACserver.properties archivo se encuentra en/usr/local/etc/kafka/
Edison Q
2
lo que funcionó para mí fue esto advertised.listeners=PLAINTEXT://my.ip:9092
Sr. Crowley
14
NO UTILICE ESTO - port, advertised.host.nameson configuraciones obsoletas. kafka.apache.org/documentation/#brokerconfigs
Stephane
44

Lo que me resolvió es configurar a los oyentes así:

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

Esto hace que el agente KAFKA escuche todas las interfaces.

Pinelopi Kouleri
fuente
44
Esta debería ser la respuesta aceptada. Funciona para la configuración de múltiples nodos y tiene mucho sentido.
Piyush Shrivastava
¿Podemos usar esto en nuestro archivo app.yaml?
Codificador
40

Tenía kafka ejecutándose como un contenedor Docker y mensajes similares inundaban el registro.
YKAFKA_ADVERTISED_HOST_NAME se estableció en 'kafka'.

En mi caso, el motivo del error fue el /etc/hostsregistro faltante de 'kafka' en el contenedor 'kafka'.
Entonces, por ejemplo, ejecutar ping kafkadentro del contenedor 'kafka' fallaría conping: bad address 'kafka'

En términos de Docker, este problema se resuelve especificando hostname el contenedor.

Opciones para lograrlo:

Vlad.Bachurin
fuente
No es una respuesta per se , sino para referencia futura: cuando (o si) docker / docker # 1143 se resuelve, habrá una manera fácil de hacer referencia al host del contenedor, independientemente del sistema operativo que se use.
Michael Ahlers
Si está utilizando la imagen acoplable wurstmeister / kafka-docker (que es probablemente la más popular en el momento de escribir este artículo), vea las notas aquí sobre la configuración de ese entorno y por qué
RyanQuey
32

Estoy usando kafka_2.12-0.10.2.1:

vi config/server.properties

agregar debajo de la línea:

listeners=PLAINTEXT://localhost:9092
  • No es necesario cambiar el advertised.listeners ya que recoge el valor de la propiedad de escucha estándar.

Nombre de host y puerto que el corredor anunciará a productores y consumidores. Si no está configurado,

  • utiliza el valor para "oyentes" si está configurado

De lo contrario, utilizará el valor devuelto por java.net.InetAddress.getCanonicalHostName().

detener al corredor de Kafka:

bin/kafka-server-stop.sh

reiniciar corredor:

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

y ahora no deberías ver ningún problema.

Dean Jain
fuente
Esto lo resolvió para mí, la modificación server.propertiesno fue suficiente hasta que reinicié el corredor con un demonio recargado. Tal vez se supone que debes saber eso, pero seguro ayudó a que se especificara en esta respuesta
Bossan
Esto funcionó para mí, muchas gracias hermano. Estoy usandokafka 2.13
Alejandro Herrera
31

He sido testigo de este mismo problema en las últimas 2 semanas mientras trabajaba con Kafka y he estado leyendo esta publicación de Stackoverflow desde entonces.

Después de 2 semanas de análisis, deduje que en mi caso esto sucede cuando intento producir mensajes a un tema que no existe .

El resultado en mi caso es que Kafka envía un mensaje de error pero crea, al mismo tiempo, el tema que no existía antes. Entonces, si trato de producir algún mensaje nuevamente para ese tema después de este evento, el error ya no aparecerá como el tema que se creó.

TENGA EN CUENTA: Podría ser que mi instalación particular de Kafka se haya configurado para crear automáticamente el tema cuando no existe el mismo; eso debería explicar por qué en mi caso puedo ver el problema solo una vez para cada tema después de restablecer los temas: su configuración puede ser diferente y en ese caso seguiría recibiendo el mismo error una y otra vez.

Saludos,

Luca Tampellini

Luca Tampellini
fuente
Hola luca También estoy creando automáticamente nuevos temas. Mi pregunta es ¿cómo permite que sus consumidores descubran automáticamente este nuevo tema? Mis consumidores no lo harán. Y después de reiniciar mis consumidores, se pueden recibir nuevos mensajes, pero se pierde el mensaje que causó la creación del tema.
jchnxu
15

Tendemos a recibir este mensaje cuando intentamos suscribirnos a un tema que aún no se ha creado. Por lo general, confiamos en los temas que se crearán a priori en nuestros entornos implementados, pero tenemos pruebas de componentes que se ejecutan contra una instancia de kafka dockerizada, que comienza limpia cada vez.

En ese caso, usamos AdminUtils en nuestra configuración de prueba para verificar si el tema existe y crearlo si no. Consulte este otro desbordamiento de pila para obtener más información sobre cómo configurar AdminUtils.

Ryan McKay
fuente
8

Otra posibilidad para esta advertencia (en 0.10.2.1) es que intente sondear un tema que acaba de crearse y el líder para esta partición de tema aún no está disponible, está en medio de una elección de liderazgo.

Esperar un segundo entre la creación del tema y el sondeo es una solución alternativa.

Benoit Delbosc
fuente
6

Para cualquiera que intente ejecutar kafka en kubernetes y se encuentre con este error, esto es lo que finalmente lo resolvió para mí:

Tienes que:

  1. Agregue hostnamea la especificación de la vaina, de esa manera kafka puede encontrarse.

o

  1. Si usa hostPort, entonces necesita hostNetwork: trueydnsPolicy: ClusterFirstWithHostNet

La razón de esto es porque Kafka necesita hablar consigo mismo, y decide usar el oyente / nombre de host 'anunciado' para encontrarse a sí mismo, en lugar de usar localhost. Incluso si tiene un Servicio que señala el nombre de host anunciado en el pod, no es visible desde el pod. Realmente no sé por qué ese es el caso, pero al menos hay una solución 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
Chris
fuente
2
1. no funciona% ERROR: Local: Error de resolución del host: kafka-cluster: 9092/1001: Error al resolver 'kafka-cluster: 9092': nombre de servidor ni nombre de servidor proporcionados, o no se conoce
Lu32
¡He agregado el nombre de host igual que el nombre del servicio, trabajando para mí!
karthikeayan
6

Agregando esto ya que puede ayudar a otros. Un problema común puede ser una configuración incorrecta de advertised.host.name. Con Docker usando docker-compose, la configuración del nombre del servicio interno KAFKA_ADVERTISED_HOST_NAMEno funcionará a menos que también configure el nombre de host. docker-compose.ymlejemplo:

  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

Lo anterior sin hostname: kafkapuede emitir un LEADER_NOT_AVAILABLEal intentar conectarse. Puede encontrar un ejemplo de una docker-composeconfiguración de trabajo aquí

Paizo
fuente
6

En mi caso, estaba funcionando bien en casa, pero estaba fallando en la oficina, en el momento en que me conecto a la red de la oficina.

Así que modifiqué los config / server.properties listeners = PLAINTEXT: //: 9092 a listeners = PLAINTEXT: // localhost: 9092

En mi caso, estaba recibiendo mientras describía el Grupo de consumidores

Yoga Gowda
fuente
Por qué diablos no establecen los valores predeterminados correctos, esto me ayudó.
powder366
5

Si está ejecutando kafka en la máquina local, intente actualizar $ KAFKA_DIR / config / server.properties con la siguiente línea: listeners=PLAINTEXT://localhost:9092y luego reinicie kafka.

MrKulli
fuente
¿Cómo hago esto en docker-compose.yml?
AC28
Puede usar un script de shell de punto de entrada docs.docker.com/compose/compose-file/#entrypoint con docker compose y sobrescribe (sed) escuchas en server.properties.
MrKulli
3

Estoy usando docker-compose para construir el contenedor Kafka usando wurstmeister/kafkaimage. Agregar KAFKA_ADVERTISED_PORT: 9092propiedad a mi docker-composearchivo resolvió este error para mí.

Priyanka
fuente
3

Como quería que mi corredor de kafka se conectara con productores y consumidores remotos, no quiero advertised.listenerque me comenten. En mi caso, (ejecutando kafka en kubernetes), descubrí que mi pod kafka no tenía asignada ninguna IP de clúster. Al eliminar la línea clusterIP: Nonede services.yml, el kubernetes asigna una ip interna al pod kafka. Esto resolvió mi problema de LEADER_NOT_AVAILABLE y también la conexión remota de productores / consumidores de kafka.

Anum Sheraz
fuente
3

Cuando se produce el error LEADER_NOT_AVAILABLE, simplemente reinicie el corredor de kafka:

/bin/kafka-server-stop.sh

seguido por

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

(Nota: Zookeeper debe estar ejecutándose en este momento, si lo haces de otra manera no funcionará)

Dan
fuente
si. Ocurre cuando Kafka se inicia primero y luego Zookeeper después.
panchicore
He hecho esto y no lo resuelve del todo. Lo extraño es que el corredor se inicializa como si fuera el líder. como en New leader is 0.
Sammy
2

Esta línea debajo que he agregado config/server.properties, resolvió mi problema similar al problema anterior. Espero que esto ayude, está bastante bien documentado en el archivo server.properties, intente leer y comprender antes de modificar esto. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

ravibeli
fuente
1

Para todos aquellos que luchan con la configuración de Kafka ssl y ven este error LEADER_NOT_AVAILABLE. Una de las razones por las que podría romperse es el almacén de claves y el almacén de confianza. En el almacén de claves debe tener la clave privada del servidor + certificado de servidor firmado. En el almacén de confianza del cliente, debe tener un certificado CA intermedio para que el cliente pueda autenticar el servidor kafka. Si va a utilizar SSL para la comunicación entre intermediarios, necesita que este almacén de confianza también se establezca en el servidor. Las propiedades de los intermediarios para que puedan autenticarse entre sí.

Esa última pieza que me faltaba por error y me causó muchas horas dolorosas descubrir lo que podría significar este error LEADER_NOT_AVAILABLE. Esperemos que esto pueda ayudar a alguien.

vojtmen
fuente
¿Qué quiere decir con "clave privada del servidor"? Tengo clave de la CA y el certificado de servidor firmado en el almacén de claves del servidor de cliente mientras que en TrustStore tengo certificado de CA .. Pero todavía estoy recibiendo estos errores ..
phaigeim
Lo siento, quise decir clave privada + certificado. Estaba configurando un gran clúster y en algún lugar de la cadena de la burocracia cometió un error, por lo que uno de los certificados no coincide con la CSR. Esa podría ser otra razón también. Verifique que md5 de la clave privada, el certificado coincida y que el certificado se pueda verificar con su almacén de confianza. El almacén de confianza generalmente contiene certificados raíz e intermedios (s)
vojtmen
1

El problema se resuelve después de agregar la configuración de escucha en el archivo server.properties ubicado en el directorio de configuración. listeners = PLAINTEXT: // localhost (o su servidor): 9092 Reinicie kafka después de este cambio. Versión utilizada 2.11

Jitray
fuente
0

Para mí, sucedió debido a un
puerto Docker de configuración fallida (9093)
Puerto de comando Kafka "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName" Revisé
mi configuración para que coincida con el puerto y ahora todo está bien

guillaume verneret
fuente
0

Para mí, la causa fue usar un Zookeeper específico que no era parte del paquete Kafka. Ese Zookeeper ya estaba instalado en la máquina para otros fines. Aparentemente, Kafka no funciona con cualquier Zookeeper. Cambiar al Zookeeper que vino con Kafka lo resolvió por mí. Para no entrar en conflicto con el Zookeeper existente, tuve que modificar mi configuración para que el Zookeeper escuchara en un puerto diferente:

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

Los oyentes anunciados como se menciona en las respuestas anteriores podrían ser una de las razones. Las otras posibles razones son:

  1. El tema podría no haber sido creado. Puedes verificar esto usandobin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Verifique los servidores de arranque que le ha dado al productor para obtener los metadatos. Si el servidor bootstrap no contiene los últimos metadatos sobre el tema (por ejemplo, cuando perdió su reclamo de zookeeper). Debe agregar más de un servidor de arranque.

Además, asegúrese de tener el oyente anunciado configurado en IP:9092lugar delocalhost:9092 . Esto último significa que solo se puede acceder al intermediario a través del localhost.

Cuando encontré el error, recuerdo haberlo usado PLAINTEXT://<ip>:<PORT>en la lista de servidores de arranque (o lista de intermediarios) y funcionó, extrañamente.

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

Para mí, no especifiqué la identificación del corredor para la instancia de Kafka. Obtendrá una nueva identificación de zookeeper a veces cuando se reinicie en el entorno Docker. Si su ID de corredor es mayor que 1000, solo especifique la variable de entorno KAFKA_BROKER_ID.

Use esto para ver corredores, temas y particiones.

brew install kafkacat
kafkacat -b [kafka_ip]:[kafka_poot] -L
Anderson
fuente
0

Sé que esto se publicó hace mucho tiempo, me gustaría compartir cómo lo resolví.
desde que tengo mi computadora portátil de oficina ( se configuró VPN y proxy ). Revisé la
variable de entorno NO_PROXY

> echo %NO_PROXY%

volvió con valores vacíos
ahora he configurado NO_PROXY con localhost y 127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

si desea agregar valores existentes, entonces

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

Después de esto, reinicié Zookeeper y Kafka
funcionó de maravilla

Abhishek DK
fuente