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:
-
El tema podría no haber sido creado.
Puede verificar esto usando
bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
- 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:
-
Agregue el
hostname
dehostname
a la especificación del pod, de esa manera kafka puede encontrarse.
o
-
Si usa
hostPort
, entonces necesitahostNetwork: true
ydnsPolicy: 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.