apache-kafka producer

apache kafka - Líder no disponible Kafka en Console Producer



apache-kafka (21)

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 la configuración docker-compose, el nombre del servicio dentro de KAFKA_ADVERTISED_HOST_NAME no funcionará a menos que establezca también el nombre de host. Ejemplo de docker-compose.yml :

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: kafka puede emitir un LEADER_NOT_AVAILABLE al intentar conectarse. Puede encontrar un ejemplo de una configuración de docker-compose funcionamiento here

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


Como quería que mi corredor de kafka se conectara con productores y consumidores remotos, no quiero que se advertised.listener de advertised.listener . En mi caso, (ejecutando kafka en kubernetes), descubrí que mi kafka pod no tenía asignada ninguna IP de clúster. Al eliminar la línea clusterIP: None de 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 los productores / consumidores de kafka.


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á)


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


En mi caso, funcionaba bien en casa, pero fallaba 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


Esta línea a continuación la he agregado en config/server.properties , que 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


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


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 broker:

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

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


He sido testigo de este mismo problema en las últimas 2 semanas mientras trabajaba con Kafka y he estado leyendo esta publicación de 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 antes no existía. 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 configuró para crear automáticamente el tema en caso de que no exista, eso explica por qué en mi caso veo el problema solo una vez desde el principio: su configuración puede ser diferente y en En ese caso, seguiría teniendo el mismo error una y otra vez.

Saludos,

Luca Tampellini


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

port = 9092 advertised.host.name = localhost

Deje comentarios y listeners y advertised_listeners comentados.


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.


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. Puede verificar esto usando bin/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 de arranque no contiene los últimos metadatos sobre el tema (por ejemplo, cuando perdió su reclamo de cuidador del zoológico). Debe agregar más de un servidor de arranque.

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

Cuando encontré el error, recuerdo haber 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>


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.


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 el hostname de hostname a la especificación del pod, de esa manera kafka puede encontrarse.

o

  1. Si usa hostPort , entonces necesita hostNetwork: true y dnsPolicy: ClusterFirstWithHostNet

La razón de esto es porque Kafka necesita hablar consigo mismo, y decide usar el oyente / nombre de host ''anunciado'' para encontrarse, 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


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. Al parecer, 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


Para mí, sucedió debido a una configuración incorrecta
Puerto Docker (9093)
Puerto de comando de 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


Para todos aquellos que luchan con la configuración de Kafka ssl y ven este error LEADER_NOT_AVAILABLE. Una de las razones que pueden 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.


Podría estar relacionado con advertised.host.name configuración de advertised.host.name en su server.properties .

Lo que podría suceder es que su productor está tratando de averiguar quién es el líder de una partición determinada, se da cuenta de su advertised.host.name y advertised.port e intenta conectarse. Si estos ajustes no están configurados correctamente, puede pensar que el líder no está disponible.


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


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

En mi caso, el motivo del error fue la falta del registro /etc/hosts para ''kafka'' en el contenedor ''kafka''.
Entonces, por ejemplo, ejecutar ping kafka dentro del contenedor ''kafka'' fallaría con ping: bad address ''kafka''

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

Opciones para lograrlo:


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 other desbordamiento de pila para obtener más información sobre cómo configurar AdminUtils.