Лідер недоступний Кафка у виробнику консолі


172

Я намагаюся використовувати Кафку.
Всі конфігурації виконані правильно, але коли я намагаюся створювати повідомлення з консолі, я постійно отримую наступну помилку

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

Версія Kafka: 2.11-0.9.0.0


яку версію кафки ви використовуєте? як ви знаєте, що всі конфігурації належні? будь ласка, спробуйте додати більше інформації
Nautilus

Я використовую версію 2.11-0.9.0.0, я сказав, що всі конфігурації належні, тому що вони працювали.
Вішеш

1
@Vishesh Можете чи ви надати результат наступні команди ./bin/kafka-topics.sh --zookeeper локальний: 2181 --describe --topic yourTopicName
АВР

2
така ж помилка і для мене. Я отримую лідера ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --описуйте --topic yourTopicName, але, надсилаючи повідомлення виробнику, він зберігає помилку кидок LEADER_NOT_AVAILABLE.
Вільва

2
Я можу підтвердити цю проблему на кафці 2.2.0у 2019 році
javadba

Відповіді:


93

Це може бути пов’язано з advertised.host.nameналаштуваннями у вашому server.properties.

Що може статися, що ваш продюсер намагається з'ясувати , хто є лідером даного розділу, з'ясовує його advertised.host.nameі advertised.portта намагається підключитися. Якщо ці налаштування не налаштовані правильно, то, можливо, думка, що лідер недоступний.


1
Це виправило помилку для мене .. але коментарі в server.properties говорять, що якщо не буде налаштовано Advertisement.host.name, воно використовуватиме host.name. І host.name було налаштовано у файлі server.properties.
Містер Спарк

У мене виникла та ж проблема, і це спрацювало для мене на кафці 0,9
minhas23

3
Встановлення цього на мою IP-адресу замість загальнодоступного імені, створеного загалом, вирішило багато проблем, які у мене виникли.
Виступ

81

Я спробував усі перераховані тут рекомендації. Що для мене працювало - це піти server.propertiesі додати:

port = 9092
advertised.host.name = localhost 

Залиште listenersі advertised_listenersпрокоментуйте.


5
рішення працює для мене ( посилання на рішення vikas ) Просто хочу додати, що для мене server.propertiesфайл MAC знаходиться за адресою/usr/local/etc/kafka/
Едісон Q

2
що для мене спрацювало саме це advertised.listeners=PLAINTEXT://my.ip:9092
містер Кроулі

14
НЕ ВИКОРИСТОВУЙТЕ ЦІ - port, advertised.host.nameзастарілі конфігурації. kafka.apache.org/documentation/#brokerconfigs
Стефан

44

Що вирішило для мене це налаштувати слухачів так:

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

Це змушує брокера KAFKA слухати всі інтерфейси.


4
Це має бути прийнятою відповіддю. Працює для налаштування декількох вузлів і має багато сенсу.
Піюш Шрівастава

Чи можемо ми використовувати це у нашому файлі app.yaml?
Кодер

40

У мене кафка працювала як контейнер Докера, і подібні повідомлення доливали до журналу.
І KAFKA_ADVERTISED_HOST_NAMEбув встановлений на "kafka".

У моєму випадку причиною помилки став відсутній /etc/hostsзапис для "kafka" в самому контейнері "kafka".
Так, наприклад, запуск ping kafkaвсередині контейнера "kafka" не зможеping: bad address 'kafka'

З точки зору Docker цю проблему вирішують, вказавши hostnameконтейнер.

Варіанти її досягнення:


Це не відповідь сама по собі , але для подальшої довідки: коли (або якщо) docker / docker # 1143 буде вирішено, буде простий спосіб посилання на хост контейнера - незалежно від того, яка ОС використовується.
Майкл Алерс

Якщо ви використовуєте зображення докер-докера wurstmeister / kafka-docker (який, мабуть, найпопулярніший на момент написання цього запису), дивіться тут примітки щодо налаштування env var та чому
RyanQuey

32

Я використовую kafka_2.12-0.10.2.1:

vi config/server.properties

додати нижче рядка:

listeners=PLAINTEXT://localhost:9092
  • Не потрібно змінювати рекламувані.Listeners, оскільки воно набирає значення з властивостей std listener.

Ім'я хоста та порт, який брокер рекламує виробникам та споживачам. Якщо не встановлено,

  • він використовує значення для "слухачів", якщо він налаштований

В іншому випадку він буде використовувати значення, повернене з java.net.InetAddress.getCanonicalHostName().

зупиніть брокера Kafka:

bin/kafka-server-stop.sh

перезапустити брокера:

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

і тепер ви не повинні бачити жодних проблем.


Це вирішило це для мене, змінити server.propertiesбуло недостатньо, доки я не перезапустив брокера із перезавантаженим диманом. Може бути , ви повинні знати , що, але він упевнений , допомогло мати його , зазначений в цій відповіді
Боссан

Це працювало для мене, дякую, брате. Я використовуюkafka 2.13
Алехандро Еррера

31

Я був свідком цього самого питання протягом останніх 2 тижнів, працюючи з Кафкою і з тих пір читав цю публікацію Stackoverflow.

Після 2-х тижневих аналізів я зробив висновок, що в моєму випадку це відбувається при спробі надсилати повідомлення на тему, яка не існує .

Результатом у моєму випадку є те, що Кафка надсилає повідомлення про помилку, але створює водночас тему, яка раніше не існувала. Тож якщо я спробую знову надсилати будь-яке повідомлення на цю тему після цієї події, помилка більше не з’явиться як створена тема.

УВАГА! Примітка. Можливо, моя конкретна установка Kafka була налаштована на автоматичне створення теми, коли такої не існує; це повинно пояснити, чому в моєму випадку я можу побачити проблему лише один раз для кожної теми після скидання тем: ваша конфігурація може бути різною, і в такому випадку ви будете отримувати одну і ту ж помилку знову і знову.

З повагою,

Лука Тампелліні


Привіт Лука. Я також автоматично створюю нові теми. Моє запитання - як ви дозволяєте вашим споживачам автоматично відкривати цю нову тему? Мої споживачі цього не робитимуть. І після перезавантаження моїх споживачів можна отримувати нові повідомлення, але повідомлення, що спричинило створення теми, втрачається.
jchnxu

15

Ми зазвичай отримуємо це повідомлення, коли ми намагаємось підписатися на тему, яка ще не створена. Ми, як правило, покладаємось на теми, які потрібно створити апріорі в наших розгорнутих середовищах, але у нас є компоненти тестів, які працюють проти докерізованого екземпляра kafka, який починається очищення кожного разу.

У цьому випадку ми використовуємо AdminUtils у нашому тестовому налаштуванні, щоб перевірити, чи існує тема, і створити її, якщо ні. Дивіться цей переповнення іншого стека, щоб дізнатися більше про налаштування AdminUtils.


8

Інша можливість цього попередження (у 0.10.2.1.) Полягає в тому, що ви намагаєтесь опитувати тему, яка щойно створена, і ведучий цього розділу ще не доступний, ви знаходитесь в середині виборів керівництва.

Чекати секунди між створенням теми та опитуванням - обхідне рішення.


6

Для тих, хто намагається запустити kafka на kubernetes і зіткнувся з цією помилкою, це остаточно вирішило це для мене:

Ви повинні:

  1. Додайте hostnameдо специфікації стручка, щоб кафка опинилася.

або

  1. Якщо ви використовуєте hostPort, то вам потрібно hostNetwork: trueіdnsPolicy: ClusterFirstWithHostNet

Причиною цього є те, що Кафці потрібно поговорити з самим собою, і вона вирішує використовувати «рекламоване» слухач / ім’я хоста, щоб знайти себе, а не використовувати localhost. Навіть якщо у вас є служба, яка вказує рекламоване ім'я хоста на стручок, воно не видно зсередини. Я не знаю, чому це так, але принаймні є рішення.

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

2
1. не працює% ПОМИЛКА: Локальна: Помилка вирішення хосту: kafka-cluster: 9092/1001: Не вдалося вирішити 'kafka-cluster: 9092': ім'я вузла, ні ім'я серва, або невідомо
Lu32,

я додав ім'я хоста так само, як ім'я служби, працює для мене!
karthikeayan

6

Якщо додати це, оскільки це може допомогти іншим. Поширеною проблемою може бути неправильна конфігурація advertised.host.name. Якщо Docker використовує docker-compose, встановивши ім'я служби всередині KAFKA_ADVERTISED_HOST_NAMEроботи, якщо ви також не встановите ім'я хоста. 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

Вище , НЕ hostname: kafkaможе видати LEADER_NOT_AVAILABLEпри спробі підключення. Ви можете знайти приклад робочої docker-composeконфігурації тут


6

У моєму випадку вдома він працював чудово, але в роботі не працював, на момент підключення до офісної мережі.

Так змінили слухачів config / server.properties = PLAINTEXT: //: 9092 для слухачів = PLAINTEXT: // localhost: 9092

У моєму випадку я отримував опис групи споживачів


Чому б вони не встановили правильні типові настройки, мені це допомогло.
порошок366

5

Якщо ви запускаєте kafka на локальній машині, спробуйте оновити $ KAFKA_DIR / config / server.properties з рядком нижче: listeners=PLAINTEXT://localhost:9092а потім перезапустіть kafka.


як це зробити на docker-compose.yml?
AC28

Ви можете використовувати скрипт оболонки вхідної точки docs.docker.com/compose/compose-file/#entrypoint з docker compose та перезаписувати (sed) слухачів у server.properties.
MrKulli

3

Я використовую docker-compose для створення контейнера Kafka за допомогою wurstmeister/kafkaзображення. Додавання KAFKA_ADVERTISED_PORT: 9092властивості до мого docker-composeфайлу вирішило цю помилку для мене.


3

Оскільки я хотів, щоб мій брокер kafka зв'язувався з віддаленими виробниками та споживачами, тому я не хочу advertised.listenerкоментувати це. У моєму випадку (запустивши kafka на кабернетах) я виявив, що моєму kafka pod не призначено жодного IP кластера. Видаляючи рядок clusterIP: Noneз services.yml, kubernetes призначає внутрішній-ip до pod kafka pod. Це вирішило мою проблему LEADER_NOT_AVAILABLE, а також віддалене підключення виробників / споживачів kafka.


3

Коли помилка LEADER_NOT_AVAILABLE видаляється, просто перезапустіть брокер kafka:

/bin/kafka-server-stop.sh

слідом за ним

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

(Примітка: Zookeeper повинен бути запущений до цього часу, якщо ви робите інше, це не буде працювати)


так. трапляється, коли кафку починають спочатку, а зоохранник - після.
панчикор

Я це зробив, і це не зовсім вирішує. Що дивно, це те, що брокер робить ініціалізацію так, ніби це лідер. як у New leader is 0.
Семмі

2

Цей рядок нижче, який я додав config/server.properties, вирішив мою проблему, подібну вище. Сподіваюся, це допомагає, його досить добре зафіксовано у файлі server.properties, спробуйте прочитати та зрозуміти, перш ніж змінювати це. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Для всіх, хто бореться з налаштуванням Kafka ssl і бачить цю помилку LEADER_NOT_AVAILABLE. Однією з причин, які можуть бути порушені, є магазин брелоків і довіра. У магазині ключів потрібно мати приватний ключ сервера + підписаний серверний сертифікат. У клієнтському довіреному магазині потрібно мати посередницький сертифікат CA, щоб клієнт міг автентифікувати сервер kafka. Якщо ви будете використовувати ssl для зв'язку між посередниками, вам потрібно цей довірений магазин також встановити в server.properties брокерів, щоб вони могли автентифікувати один одного.

Цей останній твір я помилково пропустив і викликав у мене багато болісних годин, з'ясовуючи, що може означати ця помилка LEADER_NOT_AVAILABLE. Сподіваємось, це може комусь допомогти.


Що ви маєте на увазі під приватним ключем сервера? У мене є ключ CA та підписаний серверний сертифікат у сховищі серверів, тоді як у Clisto truststore у мене є сертифікат CA .. Але все-таки я отримую ці помилки ..
phaigeim

Вибачте, я мав на увазі приватний ключ + сертифікат. Я створив великий кластер і десь у ланцюжку бюрократії помилився, тому один із сертифікатів не відповідав КСВ. Це може бути й інша причина. Двічі перевірте, що md5 приватного ключа, відповідність сертифіката та цей сертифікат можна перевірити у вашому довіреному магазині. Як правило, Truststore містить кореневі та проміжні сертифікати
vojtmen

1

Проблема вирішується після додавання налаштування слухача у файл server.properties, розташований у каталозі config. слухачів = PLAINTEXT: // localhost (або ваш сервер): 9092 Перезапустіть kafka після цієї зміни. Використовувана версія 2.11


0

Для мене це сталося через пропуск конфігурації
порт Docker (9093)
Порт команди Kafka "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
Я перевірив свою конфігурацію, щоб відповідати порту та зараз все нормально


0

Для мене причиною було використання конкретного Zookeeper, який не входив до пакету Kafka. Цей Zookeeper вже був встановлений на машині для інших цілей. Мабуть, Кафка не працює з будь-яким зоопарком. Перехід на Зоопарку, який прийшов із Кафкою, вирішив це для мене. Щоб не вступати в конфлікт із існуючим Zookeeper, мені довелося змінити конфігурацію, щоб Zookeeper прослуховував інший порт:

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

0

Рекламовані слухачі, як згадувалося у вищезазначених відповідях, можуть бути однією з причин. Інші можливі причини:

  1. Тема, можливо, не створена. Ви можете перевірити це за допомогоюbin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Перевірте свої сервери завантаження, які ви дали виробнику, щоб отримати метадані. Якщо сервер завантаження не містить найновіших метаданих про тему (наприклад, коли він втратив заяву про зоопарк). Ви повинні додавати більше одного сервера завантаження.

Також переконайтеся, що IP:9092замість нього встановлено рекламований слухач localhost:9092. Останнє означає, що брокер доступний лише через localhost.

Коли я зіткнувся з помилкою, я пам'ятаю, що використовував PLAINTEXT://<ip>:<PORT>у списку завантажувальних серверів (або список брокерів), і це спрацювало, як не дивно.

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

0

Для мене я не вказав ідентифікатора брокера для екземпляра Kafka. Він отримає новий ідентифікатор від zookeeper іноді, коли він перезапуститься в середовищі Docker. Якщо ідентифікатор вашого брокера перевищує 1000, просто вкажіть змінну середовища KAFKA_BROKER_ID.

Використовуйте це, щоб переглянути посередників, тем та розділів.

brew install kafkacat
kafkacat -b [kafka_ip]:[kafka_poot] -L

0

я знаю, що це було розміщено давно, я хотів би поділитися тим, як я це вирішив.
оскільки у мене є офісний ноутбук ( налаштовано VPN та проксі ).
Я перевірив змінну середовища NO_PROXY

> echo %NO_PROXY%

він повернувся з порожніми значеннями,
тепер я встановив NO_PROXY з localhost та 127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

якщо ви хочете додати існуючі значення, то

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

після цього я перезапустив зоопарку і кафка
працювала як шарм

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.