Pemimpin Tidak Tersedia Kafka di Produser Konsol


172

Saya mencoba menggunakan Kafka.
Semua konfigurasi dilakukan dengan benar tetapi ketika saya mencoba untuk menghasilkan pesan dari konsol saya terus mendapatkan kesalahan berikut

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

Versi kafka: 2.11-0.9.0.0


versi kafka apa yang kamu gunakan? bagaimana Anda tahu bahwa semua konfigurasi itu benar? coba tambahkan informasi lebih lanjut
Nautilus

Saya menggunakan versi 2.11-0.9.0.0, saya mengatakan semua konfigurasi sudah benar karena sudah berfungsi.
Vishesh

1
@Vishesh Bisakah Anda memberikan hasil dari perintah berikut ./bin/kafka-topics.sh --zookeeper localhost: 2181 - deskripsikan --topic yourTopicName
avr

2
kesalahan yang sama untuk saya juga. Saya mendapatkan pemimpin ./bin/kafka-topics.sh --zookeeper <ip>: 2181 - deskripsikan --topic YourTopicName tetapi saat mengirim pesan ke produser, ia tetap membuat kesalahan LEADER_NOT_AVAILABLE.
Vilva

2
Saya dapat mengkonfirmasi masalah ini pada kafka 2.2.0pada tahun 2019
javadba

Jawaban:


93

Ini mungkin terkait dengan advertised.host.namepengaturan di server.properties.

Apa yang bisa terjadi adalah bahwa produsen Anda sedang mencoba untuk mencari tahu siapa adalah pemimpin untuk partisi tertentu, angka keluar nya advertised.host.namedan advertised.portdan mencoba untuk menghubungkan. Jika pengaturan ini tidak dikonfigurasi dengan benar maka mungkin berpikir bahwa pemimpin tidak tersedia.


1
Itu memperbaiki kesalahan untuk saya .. tetapi komentar di server.properties mengatakan bahwa jika advertised.host.name tidak dikonfigurasi akan menggunakan host.name. Dan host.name dikonfigurasi dalam file server.properties.
Tuan Spark

Saya mendapat masalah yang sama dan ini bekerja untuk saya untuk kafka 0,9
minhas23

3
Menetapkan ini ke alamat IP saya dan bukan nama host publik AWS yang dihasilkan menyelesaikan banyak masalah yang saya alami.
Spechal

81

Saya mencoba semua rekomendasi yang tercantum di sini. Apa yang berhasil bagi saya adalah untuk pergi server.propertiesdan menambahkan:

port = 9092
advertised.host.name = localhost 

Tinggalkan listenersdan advertised_listenersberi komentar.


5
solusi bekerja untuk saya ( tautan solusi vikas ) Hanya ingin menambahkan untuk saya pada server.propertiesfile MAC terletak di/usr/local/etc/kafka/
Edison Q

2
yang berhasil bagi saya adalah ini advertised.listeners=PLAINTEXT://my.ip:9092
Tn. Crowley

14
JANGAN GUNAKAN INI - port, advertised.host.nameadalah konfigurasi usang. kafka.apache.org/documentation/#brokerconfigs
Stephane

44

Apa yang dipecahkan bagi saya adalah mengatur pendengar seperti:

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

Hal ini membuat broker KAFKA mendengarkan semua antarmuka.


4
Ini harus menjadi jawaban yang diterima. Bekerja untuk konfigurasi multi-simpul dan membuat banyak akal.
Piyush Shrivastava

Bisakah kita menggunakan ini di file app.yaml kita?
Coder

40

Saya memiliki kafka berjalan sebagai wadah Docker dan pesan serupa membanjiri log.
Dan KAFKA_ADVERTISED_HOST_NAMEdiatur ke 'kafka'.

Dalam kasus saya alasan kesalahan adalah /etc/hostscatatan yang hilang untuk 'kafka' dalam wadah 'kafka' itu sendiri.
Jadi, misalnya, berlari ping kafkadi dalam wadah 'kafka' akan gagalping: bad address 'kafka'

Dalam hal Docker masalah ini akan diselesaikan dengan menentukan hostnamewadah.

Opsi untuk mencapainya:


Ini bukan jawaban semata , tetapi untuk referensi di masa mendatang: ketika (atau jika) buruh pelabuhan / buruh pelabuhan # 1143 diselesaikan, akan ada cara mudah untuk mereferensikan host penampung — terlepas dari OS mana yang digunakan.
Michael Ahlers

Jika Anda menggunakan gambar docker wurstmeister / kafka-docker (yang mungkin paling populer pada saat penulisan ini), lihat catatan di sini mengenai pengaturan env var dan mengapa
RyanQuey

32

Saya menggunakan kafka_2.12-0.10.2.1:

vi config/server.properties

tambahkan di bawah garis:

listeners=PLAINTEXT://localhost:9092
  • Tidak perlu mengubah pengiklan yang diiklankan karena mengambil nilai dari properti pendengar std.

Hostname dan port broker akan beriklan ke produsen dan konsumen. Jika tidak diatur,

  • menggunakan nilai untuk "pendengar" jika dikonfigurasi

Jika tidak, itu akan menggunakan nilai yang dikembalikan dari java.net.InetAddress.getCanonicalHostName().

hentikan broker Kafka:

bin/kafka-server-stop.sh

mulai ulang broker:

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

dan sekarang Anda seharusnya tidak melihat masalah apa pun.


Ini menyelesaikannya untuk saya, memodifikasi server.propertiestidak cukup sampai saya memulai kembali broker dengan deamon yang dimuat ulang. Mungkin Anda seharusnya mengetahuinya, tetapi pasti membantu menentukannya dalam jawaban ini
Bossan

Ini bekerja untuk saya, terima kasih banyak kawan. Saya menggunakankafka 2.13
Alejandro Herrera

31

Saya telah menyaksikan masalah yang sama dalam 2 minggu terakhir saat bekerja dengan Kafka dan telah membaca posting Stackoverflow ini sejak itu.

Setelah 2 minggu analisis saya menyimpulkan bahwa dalam kasus saya ini terjadi ketika mencoba untuk menghasilkan pesan ke topik yang tidak ada .

Hasil dalam kasus saya adalah bahwa Kafka mengirim pesan kesalahan kembali tetapi menciptakan, pada saat yang sama, topik yang tidak ada sebelumnya. Jadi jika saya mencoba membuat pesan apa pun lagi untuk topik itu setelah acara ini, kesalahan tidak akan muncul lagi sebagai topik yang telah dibuat.

TOLONG DICATAT: Bisa jadi instalasi Kafka khusus saya telah dikonfigurasi untuk secara otomatis membuat topik ketika hal yang sama tidak ada; yang seharusnya menjelaskan mengapa dalam kasus saya, saya dapat melihat masalah hanya sekali untuk setiap topik setelah mengatur ulang topik: konfigurasi Anda mungkin berbeda dan dalam hal ini Anda akan terus menerima kesalahan yang sama berulang kali.

Salam,

Luca Tampellini


Hai Luca. Saya juga membuat topik baru secara otomatis. Pertanyaan saya adalah bagaimana Anda membiarkan konsumen menemukan topik baru ini secara otomatis? Konsumen saya tidak akan melakukannya. Dan setelah saya me-restart konsumen saya pesan baru dapat diterima tetapi pesan yang menyebabkan penciptaan topik hilang.
jchnxu

15

Kami cenderung mendapatkan pesan ini ketika kami mencoba berlangganan ke topik yang belum dibuat. Kami umumnya mengandalkan topik yang akan dibuat apriori di lingkungan yang digunakan, namun kami memiliki tes komponen yang dijalankan terhadap turunan kafka berlabuh, yang mulai bersih setiap saat.

Dalam hal ini, kami menggunakan AdminUtils dalam pengaturan pengujian kami untuk memeriksa apakah topik ada dan membuatnya jika tidak. Lihat ini lain stack overflow untuk lebih lanjut tentang pengaturan AdminUtils.


8

Kemungkinan lain untuk peringatan ini (dalam 0.10.2.1) adalah Anda mencoba untuk memilih topik yang baru saja dibuat dan pemimpin untuk partisi-topik ini belum tersedia, Anda berada di tengah pemilihan kepemimpinan.

Menunggu sedetik antara penciptaan topik dan pemungutan suara adalah solusi.


6

Bagi siapa pun yang mencoba menjalankan kafka di kubernetes dan mengalami kesalahan ini, inilah yang akhirnya menyelesaikannya untuk saya:

Anda harus:

  1. Tambahkan hostnameke spec pod, dengan begitu kafka dapat menemukan dirinya sendiri.

atau

  1. Jika menggunakan hostPort, maka Anda perlu hostNetwork: truedandnsPolicy: ClusterFirstWithHostNet

Alasan untuk ini adalah karena Kafka perlu berbicara dengan dirinya sendiri, dan itu memutuskan untuk menggunakan pendengar / hostname 'diiklankan' untuk menemukan sendiri, daripada menggunakan localhost. Bahkan jika Anda memiliki Layanan yang menunjukkan nama host yang diiklankan di pod, itu tidak terlihat dari dalam pod. Saya tidak benar-benar tahu mengapa itu terjadi, tetapi setidaknya ada solusinya.

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. tidak berfungsi% ERROR: Lokal: Kegagalan resolusi host: kafka-cluster: 9092/1001: Gagal menyelesaikan 'kafka-cluster: 9092': nodename atau servname yang disediakan, atau tidak dikenal
Lu32

saya telah menambahkan nama host sama dengan nama layanan, bekerja untuk saya!
karthikeayan

6

Menambahkan ini karena dapat membantu orang lain. Masalah umum dapat berupa kesalahan konfigurasi advertised.host.name. Dengan Docker menggunakan pengaturan pembuatan docker nama layanan di dalam KAFKA_ADVERTISED_HOST_NAMEtidak akan berfungsi kecuali jika Anda mengatur nama host juga. docker-compose.ymlcontoh:

  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

Di atas tanpa hostname: kafkadapat mengeluarkan LEADER_NOT_AVAILABLEsaat mencoba untuk terhubung. Anda dapat menemukan contoh docker-composekonfigurasi yang berfungsi di sini


6

Dalam kasus saya, itu bekerja dengan baik di rumah, tetapi gagal di kantor, saat saya terhubung ke jaringan kantor.

Jadi memodifikasi config / server.properties listeners = PLAINTEXT: //: 9092 menjadi listeners = PLAINTEXT: // localhost: 9092

Dalam kasus saya, saya mendapatkan saat menggambarkan Grup Konsumen


Kenapa sih mereka tidak mengatur default yang benar, ini membantu saya.
bubuk366

5

Jika Anda menjalankan kafka pada mesin lokal, coba perbarui $ KAFKA_DIR / config / server.properties dengan baris di bawah ini: listeners=PLAINTEXT://localhost:9092dan kemudian mulai ulang kafka.


bagaimana saya melakukan ini di docker-compose.yml?
AC28

Anda dapat menggunakan skrip shell titik entri docs.docker.com/compose/compose-file/#entrypoint dengan buruh pelabuhan menulis dan menimpa (sed) pendengar di server.properties.
MrKulli

3

Saya menggunakan komposisi buruh pelabuhan untuk membangun wadah Kafka menggunakan wurstmeister/kafkagambar. Menambahkan KAFKA_ADVERTISED_PORT: 9092properti ke docker-composefile saya memecahkan kesalahan ini untuk saya.


3

Karena saya ingin broker kafka saya terhubung dengan produsen dan konsumen jarak jauh, Jadi saya tidak ingin advertised.listenerdikomentari. Dalam kasus saya, (menjalankan kafka di kubernetes), saya mengetahui bahwa pod kafka saya tidak diberi IP Cluster apa pun. Dengan menghapus baris clusterIP: Nonedari services.yml, kubernetes memberikan internal-ip ke pod kafka. Ini menyelesaikan masalah saya tentang LEADER_NOT_AVAILABLE dan juga koneksi jarak jauh dari produsen / konsumen kafka.


3

Saat LEADER_NOT_AVAILABLE kesalahan terjadi, cukup restart broker kafka:

/bin/kafka-server-stop.sh

diikuti oleh

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

(Catatan: Zookeeper harus berjalan saat ini, jika Anda melakukannya, ia tidak akan berfungsi)


Iya. terjadi ketika kafka dimulai pertama kali dan penjaga kebun binatang setelah.
panchicore

Saya telah melakukan ini dan itu tidak cukup menyelesaikannya. Yang aneh adalah bahwa broker melakukan inisialisasi seolah-olah itu adalah pemimpin. seperti pada New leader is 0.
Sammy

2

Baris di bawah ini saya telah menambahkan config/server.properties, yang menyelesaikan masalah saya masalah yang sama di atas. Semoga ini bisa membantu, cukup banyak didokumentasikan dengan baik dalam file server.properties, cobalah membaca dan memahami sebelum Anda memodifikasi ini. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Untuk semua yang berjuang dengan pengaturan Kafka ssl dan melihat kesalahan LEADER_NOT_AVAILABLE ini. Salah satu alasan yang mungkin rusak adalah keystore dan truststore. Di keystore Anda harus memiliki kunci pribadi dari server + sertifikat server yang ditandatangani. Di truststore klien, Anda harus memiliki sertifikat CA intermedidate agar klien dapat mengotentikasi server kafka. Jika Anda akan menggunakan ssl untuk komunikasi antar broker, Anda perlu truststore ini juga diatur di server.properti dari broker sehingga mereka dapat saling mengotentikasi.

Bagian terakhir yang saya lewatkan secara salah dan menyebabkan saya banyak waktu yang menyakitkan mencari tahu apa arti kesalahan LEADER_NOT_AVAILABLE ini. Semoga ini bisa membantu seseorang.


Apa yang Anda maksud dengan "kunci pribadi server"? Saya memiliki kunci CA dan menandatangani sertifikat server di server keystore sedangkan di Klien truststore saya memiliki sertifikat CA .. Tapi saya masih mendapatkan kesalahan ini ..
phaigeim

Maaf saya maksudkan kunci pribadi + sertifikat. Saya membuat cluster besar dan di suatu tempat dalam rantai birokrasi membuat kesalahan sehingga salah satu sertifikat belum cocok dengan CSR. Itu mungkin alasan lain juga. Periksa ulang apakah MD5 kunci pribadi, sertifikat cocok dan sertifikat itu dapat diverifikasi dengan truststore Anda. Truststore biasanya berisi sertifikat root dan menengah
vojtmen

1

Masalah diselesaikan setelah menambahkan pengaturan pendengar pada file server.properties yang terletak di direktori config. listeners = PLAINTEXT: // localhost (atau server Anda): 9092 Mulai ulang kafka setelah perubahan ini. Versi yang digunakan 2.11


0

Bagi saya, itu terjadi karena konfigurasi
port Docker yang hilang (9093)
Kafka command port "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
Saya memeriksa konfigurasi saya untuk mencocokkan port dan sekarang semuanya baik-baik saja


0

Bagi saya, penyebabnya adalah menggunakan Zookeeper spesifik yang bukan bagian dari paket Kafka. Zookeeper itu sudah diinstal pada mesin untuk keperluan lain. Rupanya Kafka tidak bekerja dengan sembarang Zookeeper. Beralih ke Zookeeper yang datang bersama Kafka menyelesaikannya untukku. Agar tidak bertentangan dengan Zookeeper yang ada, saya harus memodifikasi konfigurasi saya agar Zookeeper mendengarkan pada port yang berbeda:

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

0

Pendengar yang diiklankan seperti yang disebutkan dalam jawaban di atas bisa menjadi salah satu alasannya. Alasan lain yang mungkin adalah:

  1. Topik mungkin belum dibuat. Anda dapat memeriksa ini menggunakanbin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Periksa server bootstrap Anda yang telah Anda berikan kepada produser untuk mengambil metadata. Jika server bootstrap tidak berisi metadata terbaru tentang topik (misalnya, ketika kehilangan klaim penjaga kebunnya). Anda harus menambahkan lebih dari satu server bootstrap.

Selain itu, pastikan Anda mengatur pendengar yang diiklankan untuk IP:9092menggantikan localhost:9092. Yang terakhir berarti bahwa broker hanya dapat diakses melalui localhost.

Ketika saya menemukan kesalahan, saya ingat pernah menggunakan PLAINTEXT://<ip>:<PORT>daftar bootstrap server (atau daftar pialang) dan ternyata berhasil, anehnya.

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

0

Bagi saya, saya tidak menentukan id broker untuk Kafka instance. Ini akan mendapatkan id baru dari zookeeper kadang-kadang ketika restart di lingkungan Docker. Jika id broker Anda lebih besar dari 1000, cukup tentukan variabel lingkungan KAFKA_BROKER_ID.

Gunakan ini untuk melihat broker, topik dan partisi.

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

0

saya tahu ini sudah lama diposting, saya ingin berbagi bagaimana saya menyelesaikannya.
karena saya punya laptop kantor ( VPN dan proksi dikonfigurasi).
saya memeriksa variabel lingkungan NO_PROXY

> echo %NO_PROXY%

kembali dengan nilai kosong
sekarang saya telah menetapkan NO_PROXY dengan localhost dan 127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

jika Anda ingin menambahkan nilai yang ada, maka

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

setelah ini, saya telah me-restart zookeeper dan kafka
bekerja seperti mantra

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.