Líder não disponível Kafka no produtor de console

172

Estou tentando usar o Kafka.
Todas as configurações são feitas corretamente, mas quando tento produzir uma mensagem do console, continuo recebendo o seguinte erro

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

Versão Kafka: 2.11-0.9.0.0

Vishesh
fonte
qual versão do kafka você está usando? como você sabe que todas as configurações são adequadas? por favor, tente adicionar mais informações
Nautilus
Estou usando a versão 2.11-0.9.0.0, eu disse que todas as configurações estão corretas porque estava funcionando.
Vishesh
1
@Vishesh Você pode fornecer o resultado do seguinte comando ./bin/kafka-topics.sh --zookeeper localhost: 2181 --describe --topic yourTopicName
avr
2
mesmo erro para mim também. Estou recebendo o líder ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --describe --topic yourTopicName, mas ao enviar uma mensagem ao produtor, ele gera o erro LEADER_NOT_AVAILABLE.
Vilva 29/03
2
Posso confirmar esse problema no kafka 2.2.0em 2019
javadba 26/07/19

Respostas:

93

Pode estar relacionado à advertised.host.nameconfiguração no seu server.properties.

O que poderia acontecer é que o produtor está tentando descobrir quem é o líder para uma determinada partição, descobre seus advertised.host.namee advertised.porte tenta conectar. Se essas configurações não estiverem definidas corretamente, é possível que o líder esteja indisponível.

Alexey Raga
fonte
1
Isso corrigiu o erro para mim .. mas os comentários em server.properties dizem que se advertised.host.name não estiver configurado, ele usará host.name. E o host.name foi configurado no arquivo server.properties.
Sr. Faísca
Eu tenho o mesmo problema e isso funcionou para mim para kafka 0,9
minhas23
3
Definir isso como meu endereço IP em vez do nome do host público gerado pela AWS resolveu muitos problemas que eu estava tendo.
Spechal
81

Eu tentei todas as recomendações listadas aqui. O que funcionou para mim foi ir server.propertiese adicionar:

port = 9092
advertised.host.name = localhost 

Deixe listenerse advertised_listenerscomentei.

Vikas Deolaliker
fonte
5
solução funciona para mim ( link da solução da Vikas ) Só quero acrescentar que, para mim, o server.propertiesarquivo MAC está localizado em #/usr/local/etc/kafka/
Edison Q
2
o que funcionou para mim foi esta advertised.listeners=PLAINTEXT://my.ip:9092
Mr. Crowley
14
NÃO USE ISTO - port, advertised.host.namesão configurações obsoletas. kafka.apache.org/documentation/#brokerconfigs
Stephane
44

O que resolveu para mim é definir os ouvintes da seguinte forma:

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

Isso faz com que o broker KAFKA escute todas as interfaces.

Pinelopi Kouleri
fonte
4
Essa deve ser a resposta aceita. Funciona para configuração de vários nós e faz muito sentido.
Piyush Shrivastava
Podemos usar isso em nosso arquivo app.yaml?
Coder
40

Eu tinha o kafka em execução como um contêiner do Docker e mensagens semelhantes estavam inundando o log.
EKAFKA_ADVERTISED_HOST_NAME foi definido como 'kafka'.

No meu caso, o motivo do erro foi o /etc/hostsregistro ausente para 'kafka' no contêiner 'kafka'.
Por exemplo, rodar ping kafkadentro do contêiner 'kafka' falharia comping: bad address 'kafka'

Em termos de Docker, esse problema é resolvido especificando hostname o contêiner.

Opções para alcançá-lo:

Vlad.Bachurin
fonte
Não é uma resposta propriamente dita , mas para referência futura: quando (ou se) a docker / docker # 1143 for resolvida, haverá uma maneira fácil de fazer referência ao host do contêiner - independentemente de qual sistema operacional seja usado.
Michael Ahlers
Se você estiver usando a imagem da janela de encaixe wurstmeister / kafka-docker (que provavelmente é a mais popular até o momento em que este artigo foi escrito), consulte as notas aqui sobre a configuração desse env var e por que
RyanQuey
32

Estou usando o kafka_2.12-0.10.2.1:

vi config/server.properties

adicione abaixo da linha:

listeners=PLAINTEXT://localhost:9092
  • Não é necessário alterar os anunciados.listeners, pois ele pega o valor da propriedade std listener.

Nome do host e porta que o corretor anunciará aos produtores e consumidores. Se não estiver definido,

  • ele usa o valor para "listeners" se configurado

Caso contrário, ele usará o valor retornado de java.net.InetAddress.getCanonicalHostName().

pare o corretor Kafka:

bin/kafka-server-stop.sh

reinicie o broker:

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

e agora você não deve ver nenhum problema.

Dean Jain
fonte
Isso resolveu o problema para mim, server.propertiesnão bastava modificar até reiniciar o broker com um daemon recarregado. Talvez você deveria saber que, mas com certeza ajudou tê-lo especificado nesta resposta
Bossan
Isso funcionou para mim, muito obrigado mano. Estou usandokafka 2.13
Alejandro Herrera
31

Eu tenho testemunhado esse mesmo problema nas últimas 2 semanas enquanto trabalhava com Kafka e tenho lido a postagem deste Stackoverflow desde então.

Após 2 semanas de análise, deduzi que, no meu caso, isso ocorre ao tentar produzir mensagens para um tópico que não existe .

O resultado, no meu caso, é que Kafka envia uma mensagem de erro de volta, mas cria, ao mesmo tempo, o tópico que não existia antes. Portanto, se eu tentar produzir qualquer mensagem novamente para esse tópico após este evento, o erro não aparecerá mais como o tópico criado.

OBSERVE: Pode ser que minha instalação específica do Kafka tenha sido configurada para criar automaticamente o tópico quando o mesmo não existir; isso deve explicar por que, no meu caso, eu posso ver o problema apenas uma vez para cada tópico após redefinir os tópicos: sua configuração pode ser diferente e, nesse caso, você continuaria recebendo o mesmo erro repetidamente.

Saudações,

Luca Tampellini

Luca Tampellini
fonte
Oi Luca. Também estou criando novos tópicos automaticamente. Minha pergunta é como você permite que seus consumidores descubram automaticamente esse novo tópico? Meus consumidores não fazem isso. E depois que eu reinicio meus consumidores, novas mensagens podem ser recebidas, mas a mensagem que causou a criação do tópico foi perdida.
jchnxu
15

Temos a tendência de receber essa mensagem quando tentamos assinar um tópico que ainda não foi criado. Geralmente, confiamos nos tópicos a serem criados a priori em nossos ambientes implementados, mas temos testes de componentes que são executados em uma instância kafka dockerizada, que começa sempre limpa.

Nesse caso, usamos AdminUtils em nossa configuração de teste para verificar se o tópico existe e criá-lo, se não. Veja este outro estouro de pilha para obter mais informações sobre a configuração de AdminUtils.

Ryan McKay
fonte
8

Outra possibilidade para esse aviso (em 0.10.2.1) é que você tenta pesquisar um tópico que acabou de ser criado e o líder dessa partição de tópico ainda não está disponível; você está no meio de uma eleição de liderança.

Esperar um segundo entre a criação do tópico e a pesquisa é uma solução alternativa.

Benoit Delbosc
fonte
6

Para quem tenta executar o kafka no kubernetes e se deparar com esse erro, é isso que finalmente resolveu o problema para mim:

Você precisa:

  1. Adicione hostnameà especificação do pod, assim, o kafka pode se encontrar.

ou

  1. Se estiver usando hostPort, você precisará hostNetwork: trueednsPolicy: ClusterFirstWithHostNet

A razão para isso é porque o Kafka precisa se comunicar e decide usar o ouvinte / nome de host 'anunciado' para se encontrar, em vez de usar o host local. Mesmo se você tiver um serviço que aponte o nome do host anunciado no pod, ele não será visível no pod. Realmente não sei por que esse é o caso, mas pelo menos há uma solução 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
fonte
2
1. não funciona% ERRO: Local: Falha na resolução do host: kafka-cluster: 9092/1001: Falha ao resolver 'kafka-cluster: 9092': nodename nem servname fornecido, ou não conhecido
Lu32
Eu adicionei hostname como o mesmo nome do serviço, trabalhando para mim!
karthikeayan
6

Adicionando isso, pois pode ajudar outras pessoas. Um problema comum pode ser uma configuração incorreta de advertised.host.name. Com o Docker usando a configuração do docker-compose, o nome do serviço interno KAFKA_ADVERTISED_HOST_NAMEnão funcionará, a menos que você defina o nome do host também. docker-compose.ymlexemplo:

  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

O item acima hostname: kafkapode emitir um LEADER_NOT_AVAILABLEao tentar conectar-se. Você pode encontrar um exemplo de uma docker-composeconfiguração de trabalho aqui

Paizo
fonte
6

No meu caso, estava funcionando bem em casa, mas estava falhando no escritório, no momento em que me conectei à rede do escritório.

Foram modificados os ouvintes config / server.properties = PLAINTEXT: //: 9092 para listeners = PLAINTEXT: // localhost: 9092

No meu caso, eu estava conseguindo descrever o Grupo de Consumidores

Yoga Gowda
fonte
Por que diabos eles não definem os padrões corretos, isso me ajudou.
powder366
5

Se você estiver executando o kafka na máquina local, tente atualizar $ KAFKA_DIR / config / server.properties com a linha abaixo: listeners=PLAINTEXT://localhost:9092e, em seguida, reinicie o kafka.

MrKulli
fonte
como faço isso no docker-compose.yml?
AC28
Você pode usar um script de shell do ponto de entrada docs.docker.com/compose/compose-file/#entrypoint com o docker compor e substituir ouvintes (sed) em server.properties.
precisa saber é o seguinte
3

Estou usando o docker-compose para criar o contêiner Kafka usando a wurstmeister/kafkaimagem. Adicionar KAFKA_ADVERTISED_PORT: 9092propriedade ao meu docker-composearquivo resolveu esse erro para mim.

Priyanka
fonte
3

Como eu queria que meu corretor kafka se conectasse com produtores e consumidores remotos, não quero advertised.listenerser comentado. No meu caso, (executando o kafka no kubernetes), descobri que meu pod do kafka não recebeu nenhum IP de cluster. Removendo a linha clusterIP: Nonede services.yml, o kubernetes atribui um ip interno ao pod kafka. Isso resolveu meu problema de LEADER_NOT_AVAILABLE e também a conexão remota de produtores / consumidores de kafka.

Anum Sheraz
fonte
3

Quando o erro LEADER_NOT_AVAILABLE for lançado, basta reiniciar o broker kafka:

/bin/kafka-server-stop.sh

Seguido por

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

(Observação: o Zookeeper deve estar em execução a essa hora, se você fizer o contrário, não funcionará)

Dan
fonte
sim. acontece quando o kafka é iniciado primeiro e o tratador depois.
panchicore
Eu fiz isso e não resolve completamente. O que é estranho é que o corretor é inicializado como se fosse o líder. como em New leader is 0.
Sammy
2

Esta linha abaixo eu adicionei config/server.properties, que resolveu meu problema semelhante acima. Espero que isso ajude, pois está muito bem documentado no arquivo server.properties, tente ler e entender antes de modificar isso. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

ravibeli
fonte
1

Para todos aqueles que estão lutando com a instalação do Kafka ssl e vendo esse erro LEADER_NOT_AVAILABLE. Um dos motivos que pode estar quebrado é o keystore e o armazenamento confiável. No keystore, você precisa ter uma chave privada do servidor + certificado do servidor assinado. No armazenamento confiável do cliente, você precisa ter um certificado CA intermediário para que o cliente possa autenticar o servidor kafka. Se você usará o ssl para comunicação entre corretores, será necessário que esse armazenamento confiável também esteja definido nas server.properties dos intermediários para que eles possam se autenticar.

Essa última peça que eu estava perdendo por engano e me causou muitas horas dolorosas ao descobrir o que esse erro LEADER_NOT_AVAILABLE poderia significar. Espero que isso possa ajudar alguém.

vojtmen
fonte
O que você quer dizer com "chave privada do servidor"? Tenho chave CA e certificado de servidor assinado em keystore do servidor enquanto no cliente TrustStore tenho certificado da CA .. Mas eu ainda estou recebendo esses erros ..
phaigeim
Desculpe, eu quis dizer chave privada + certificado. Eu estava montando um cluster grande e em algum lugar da cadeia burocrática cometeu um erro, para que um dos certificados não correspondesse à RSE. Essa pode ser outra razão também. Verifique novamente se o md5 da chave privada, o certificado corresponde e se esse certificado pode ser verificado com seu armazenamento confiável. Truststore tipicamente contém raiz e (s) certificados intermediários
vojtmen
1

O problema foi resolvido após a adição da configuração do ouvinte no arquivo server.properties localizado no diretório config. listeners = PLAINTEXT: // localhost (ou seu servidor): 9092 Reinicie o kafka após essa alteração. Versão usada 2.11

Jitray
fonte
0

Para mim, isso aconteceu devido a uma falha na configuração da
porta Docker (9093) da
porta de comando Kafka "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
Verifiquei minha configuração para corresponder à porta e agora está tudo bem

guillaume verneret
fonte
0

Para mim, a causa foi usar um Zookeeper específico que não fazia parte do pacote Kafka. O Zookeeper já estava instalado na máquina para outros fins. Aparentemente, Kafka não funciona com nenhum tratador de animais. Mudar para o tratador que acompanha Kafka resolveu isso para mim. Para não entrar em conflito com o Zookeeper existente, tive que modificar minha configuração para que o Zookeeper escute em uma porta diferente:

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

Os ouvintes anunciados, conforme mencionado nas respostas acima, podem ser um dos motivos. Os outros motivos possíveis são:

  1. O tópico pode não ter sido criado. Você pode verificar isso usandobin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Verifique os servidores de auto-inicialização que você forneceu ao produtor para buscar os metadados. Se o servidor de autoinicialização não contiver os metadados mais recentes sobre o tópico (por exemplo, quando ele perdeu sua reivindicação de zookeeper). Você deve adicionar mais de um servidor de autoinicialização.

Além disso, verifique se você tem o ouvinte anunciado definido como em IP:9092vez de localhost:9092. O último significa que o broker está acessível apenas através do host local.

Quando encontrei o erro, lembro-me de ter usado PLAINTEXT://<ip>:<PORT>na lista de servidores de inicialização (ou lista de corretores) e funcionou estranhamente.

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

Para mim, não especifiquei o ID do broker para a instância Kafka. Às vezes, ele recebe um novo ID do zookeeper quando reiniciar no ambiente do Docker. Se o seu ID do broker for maior que 1000, basta especificar a variável de ambienteKAFKA_BROKER_ID .

Use isso para ver intermediários, tópicos e partições.

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

Eu sei que isso foi postado há muito tempo, eu gostaria de compartilhar como eu o resolvi.
desde que eu tenho meu laptop do escritório ( VPN e proxy foi configurado).
verifiquei a variável de ambiente NO_PROXY

> echo %NO_PROXY%

retornou com valores vazios
agora eu configurei o NO_PROXY com localhost e 127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

se você deseja anexar aos valores existentes,

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

Depois disso, reiniciei o tratador e o kafka
funcionou como um encanto

Abhishek DK
fonte