Подтвердить что ты не робот

Лидер недоступен Kafka в консольном продюсере

Я пытаюсь использовать Кафку. Все настройки выполнены правильно, но когда я пытаюсь создать сообщение с консоли, я получаю следующую ошибку

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

4b9b3361

Ответ 1

Он может быть связан с настройкой advertised.host.name в вашем server.properties.

Что может случиться, так как ваш продюсер пытается выяснить, кто является лидером для данного раздела, вычисляет его advertised.host.name и advertised.port и пытается подключиться. Если эти настройки не настроены правильно, тогда может показаться, что лидер недоступен.

Ответ 2

Я попробовал все рекомендации, перечисленные здесь. Для меня работала, чтобы перейти к server.properties и добавить:

port = 9092
advertised.host.name = localhost 

Оставьте listeners и advertised_listeners закомментировано.

Ответ 3

У меня была kafka, работающая как контейнер Docker, и подобные сообщения наводнили на журнал.
И KAFKA_ADVERTISED_HOST_NAME было установлено как "кафка".

В моем случае причиной ошибки была потерянная запись /etc/hosts для "kafka" в самом контейнере "kafka" .
Так, например, запуск ping kafka внутри контейнера "kafka" завершился неудачей с помощью ping: bad address 'kafka'

В терминах Docker эта проблема решается путем указания hostname для контейнера.

Параметры для его достижения:

Ответ 4

Что для меня решило, так это настроить таких слушателей:

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

Это позволяет брокерам KAFKA прослушивать все интерфейсы.

Ответ 5

Я использую kafka_2.12-0.10.2.1:

vi config/server.properties

добавить строку ниже:

listeners=PLAINTEXT://localhost:9092
  • Нет необходимости менять AdvertiseledListeners, так как он принимает значение из свойства слушателя std.

Имя хоста и порт брокер будет рекламировать производителям и потребителям. Если не установлено,

  • он использует значение для "слушателей", если настроено

В противном случае он будет использовать значение, возвращенное из java.net.InetAddress.getCanonicalHostName().

остановить брокера Kafka:

bin/kafka-server-stop.sh

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

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

и теперь вы не должны видеть никаких проблем.

Ответ 6

Я наблюдаю эту самую проблему за последние 2 недели, работая с Kafka, и с тех пор читаю эту статью Stackoverflow.

После 2 недель анализа я пришел к выводу, что в моем случае это происходит при попытке создать сообщения для темы, которая не существует.

Результатом в моем случае является то, что Kafka отправляет сообщение об ошибке обратно, но создает, в то же время, тему, которая раньше не существовала. Поэтому, если я попытаюсь снова отправить сообщение в эту тему после этого события, ошибка больше не появится в качестве темы, которая была создана.

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Возможно, что моя конкретная установка Kafka была настроена на автоматическое создание темы, если она не существует, что объясняет, почему в моем случае я вижу проблему только один раз в самом начале: ваша конфигурация может быть различной и в в этом случае вы будете продолжать иметь одну и ту же ошибку снова и снова.

С Уважением,

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

Ответ 7

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

В этом случае мы используем AdminUtils в нашей тестовой установке, чтобы проверить, существует ли эта тема, и создать ее, если нет. См. Это другое переполнение стека для получения дополнительной информации о настройке AdminUtils.

Ответ 8

Другая возможность для этого предупреждения (в версии 0.10.2.1) заключается в том, что вы пытаетесь опросить тему, которая только что была создана, и лидер для этого раздела темы еще не доступен, вы находитесь в середине выборов руководства.

Ожидание второй между созданием темы и опросом является обходным способом.

Ответ 9

Для тех, кто пытается запустить кафку на кубернетах и ​​сталкивается с этой ошибкой, это то, что окончательно разрешило это для меня:

Вы должны либо:

  • Добавьте hostname в спецификацию pod, таким образом kafka может найти себя.

или

  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

Ответ 10

Добавление этого, так как это может помочь другим. Распространенной проблемой может быть неправильная конфигурация advertised.host.name. В Docker, использующем docker-compose, установка имени службы внутри KAFKA_ADVERTISED_HOST_NAME будет работать, если вы не 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 здесь

Ответ 11

В моем случае он работал нормально дома, но он не работал в офисе, как только я подключился к офисной сети.

Так изменились настройки config/server.properties listeners = PLAINTEXT://: 9092 для слушателей = PLAINTEXT://localhost: 9092

В моем случае я уже описывал группу потребителей

Ответ 12

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

Ответ 13

Если вы используете kafka на локальном компьютере, попробуйте обновить $ KAFKA_DIR/config/server.properties с помощью следующей строки: listeners=PLAINTEXT://localhost:9092 а затем перезапуск kafka.

Ответ 14

Поскольку я хотел, чтобы мой брокер kafka соединился с удаленными производителями и потребителями, я не хочу, чтобы advertised.listener был прокомментирован. В моем случае, (запустив kafka на кубернетах), я узнал, что моему модулю kafka не назначен кластер IP. Удалив строку clusterIP: None из services.yml, кубернете назначает внутренний-ip для kafka pod. Это разрешило мою проблему LEADER_NOT_AVAILABLE, а также удаленное соединение производителей/потребителей кафки.

Ответ 15

Когда выдается ошибка LEADER_NOT_AVAILABLE, просто перезапустите брокера kafka:

/bin/kafka-server-stop.sh

с последующим

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

(Примечание: Zookeeper должен быть запущен к этому времени, если вы сделаете иначе, как обычно)

Ответ 16

В приведенной ниже строке я добавил в config/server.properties, что разрешило мою проблему, аналогичную описанной выше. Надеюсь, что это поможет, его довольно хорошо документирован в файле server.properties, попробуйте прочитать и понять, прежде чем изменять это. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

Ответ 17

Для всех, кто борется с настройкой Kafka ssl и видит эту ошибку LEADER_NOT_AVAILABLE. Одной из причин, которые могут быть нарушены, является хранилище ключей и доверительный магазин. В хранилище ключей вам должен быть закрытый ключ сертификата сервера + подписанного сервера. В клиентской доверенности вам необходимо иметь сертификат промежуточного ЦС, чтобы клиент мог аутентифицировать сервер kafka. Если вы будете использовать ssl для межблокерной связи, вам понадобится эта доверенность, также установленная в server.properties брокеров, чтобы они могли аутентифицировать друг друга.

Эта последняя часть, которую я ошибочно пропустил, вызвала у меня много мучительных часов, узнав, что может означать эта ошибка LEADER_NOT_AVAILABLE. Надеюсь, это может помочь кому-то.

Ответ 18

Проблема разрешена после добавления настройки прослушивателя в файл server.properties, расположенный в каталоге конфигурации. listeners = PLAINTEXT://localhost (или ваш сервер): 9092 Перезапустите kafka после этого изменения. Используемая версия 2.11

Ответ 19

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

Ответ 20

Для меня причиной было использование специального Zookeeper, который не был частью пакета Kafka. Этот Zookeeper уже был установлен на машине для других целей. По всей видимости, Кафка не работает ни с одним Zookeeper. Переход на Zookeeper, поставляемый с Кафкой, решил это для меня. Чтобы не конфликтовать с существующим Zookeeper, мне пришлось изменить свою конфигурацию, чтобы Zookeeper прослушивал другой порт:

[[email protected] /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182

Ответ 21

Рекламируемые слушатели, упомянутые в ответах выше, могут быть одной из причин. Другие возможные причины:

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

Кроме того, убедитесь, что у объявленного прослушивателя установлен IP:9092 вместо localhost:9092. Последнее означает, что брокер доступен только через локальный хост.

Когда я столкнулся с ошибкой, я помню, что использовал PLAINTEXT://<ip>:<PORT> в списке серверов начальной загрузки (или списке брокеров), и это работало, как ни странно.

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

Ответ 22

Для меня я не указал идентификатор брокера для экземпляра Kafka. Иногда он получает новый идентификатор от zookeeper при перезапуске в среде Docker. Если идентификатор вашего брокера больше 1000, просто укажите переменную среды KAFKA_BROKER_ID.

Используйте это, чтобы увидеть брокеров, темы и разделы.

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

Ответ 23

Сегодня у меня возникла такая же проблема. То, что я сделал, чтобы обойти эту ошибку, - сделать небольшую модификацию в файле /etc/hosts:

Измените строку 127.0.0.1 localhost localhost.localdomain на 10.0.11.12 localhost localhost.localdomain

(Предположим, что 10.0.11.12 - это один из ваших IP-адресов хоста, который слушает сервер Kafka)