Nhà lãnh đạo Không có sẵn Kafka trong Nhà sản xuất Console


172

Tôi đang cố gắng sử dụng Kafka.
Tất cả các cấu hình được thực hiện đúng nhưng khi tôi cố gắng tạo thông báo từ bảng điều khiển, tôi tiếp tục gặp lỗi sau

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

Phiên bản Kafka: 2.11-0.9.0.0


bạn đang sử dụng phiên bản nào của kafka? Làm thế nào để bạn biết rằng tất cả các cấu hình là phù hợp? vui lòng thử thêm thông tin
Nautilus

Tôi đang sử dụng phiên bản 2.11-0.9.0.0, tôi nói tất cả các cấu hình đều phù hợp vì nó đang hoạt động.
Vishesh

1
@Vishesh Bạn có thể cung cấp kết quả của lệnh sau ./bin/kafka-topics.sh --zookeeper localhost: 2181 --describe --topic yourTopicName
avr

2
tôi cũng bị lỗi như vậy Tôi đang trở thành người lãnh đạo ./bin/kafka-topics.sh --zookeeper <ip>: 2181 --describe --topic yourTopicName nhưng trong khi gửi tin nhắn cho nhà sản xuất, nó sẽ ném lỗi LEADER_NOT_AVAILABLE.
Vilva

2
Tôi có thể xác nhận sự cố này trên kafka 2.2.0vào năm 2019
javadba

Câu trả lời:


93

Nó có thể liên quan đến advertised.host.namethiết lập trong của bạn server.properties.

Điều gì có thể xảy ra là nhà sản xuất của bạn đang cố gắng tìm hiểu xem ai là người lãnh đạo cho một phân vùng nào đó, con số ra của nó advertised.host.nameadvertised.portvà cố gắng để kết nối. Nếu các cài đặt này không được định cấu hình chính xác thì có thể nghĩ rằng nhà lãnh đạo không có sẵn.


1
Điều đó đã sửa lỗi cho tôi .. nhưng các ý kiến ​​trong server.properies nói rằng nếu quảng cáo.host.name không được định cấu hình, nó sẽ sử dụng host.name. Và host.name đã được cấu hình trong tệp server.properIES.
Mr Spark

Tôi gặp vấn đề tương tự và điều này hiệu quả với tôi cho kafka 0.9
minhas23

3
Đặt địa chỉ này thành địa chỉ IP của tôi thay vì tên máy chủ công cộng được tạo AWS đã giải quyết nhiều vấn đề tôi gặp phải.
Spechal

81

Tôi đã thử tất cả các khuyến nghị được liệt kê ở đây. Những gì làm việc cho tôi là để đi đến server.propertiesvà thêm:

port = 9092
advertised.host.name = localhost 

Để lại listenersadvertised_listenersnhận xét ra.


5
giải pháp hoạt động với tôi ( liên kết giải pháp của vikas ) Chỉ muốn thêm điều đó cho tôi trên server.propertiestệp MAC được đặt tại/usr/local/etc/kafka/
Edison Q

2
điều làm việc cho tôi là đây advertised.listeners=PLAINTEXT://my.ip:9092
Ông Crowley

14
KHÔNG SỬ DỤNG NÀY - port, advertised.host.namelà các cấu hình không dùng nữa. kafka.apache.org/documentation/#brokerconfigs
Stephane

44

Điều giải quyết nó cho tôi là đặt người nghe như vậy:

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

Điều này làm cho nhà môi giới KAFKA lắng nghe tất cả các giao diện.


4
Đây phải là câu trả lời được chấp nhận. Hoạt động cho cấu hình đa nút và có nhiều ý nghĩa.
Piyush Shrivastava

Chúng tôi có thể sử dụng điều này trong tập tin app.yaml của chúng tôi không?
Coder

40

Tôi đã có kafka chạy như một container Docker và các tin nhắn tương tự đang tràn vào nhật ký.
KAFKA_ADVERTISED_HOST_NAMEđược đặt thành 'kafka'.

Trong trường hợp của tôi, lý do lỗi là /etc/hostsbản ghi bị thiếu cho 'kafka' trong chính thùng chứa 'kafka'.
Vì vậy, ví dụ, chạy ping kafkabên trong container 'kafka' sẽ thất bại vớiping: bad address 'kafka'

Về mặt Docker, vấn đề này được giải quyết bằng cách chỉ định hostnamecho container.

Các tùy chọn để đạt được nó:


Nó không phải là một câu trả lời cho mỗi gia nhập , nhưng để tham khảo trong tương lai: khi (hoặc nếu) Docker / Docker # 1143 được giải quyết, sẽ có một cách dễ dàng để tham khảo host-bất kể của container mà hệ điều hành được sử dụng.
Michael Ahlers

Nếu bạn đang sử dụng hình ảnh docker wurstmeister / kafka-docker (có lẽ là phổ biến nhất tại thời điểm viết bài này), hãy xem ghi chú ở đây về cài đặt env var và tại sao
RyanQuey

32

Tôi đang sử dụng kafka_2.12-0.10.2.1:

vi config/server.properties

thêm dòng dưới đây:

listeners=PLAINTEXT://localhost:9092
  • Không cần phải thay đổi các quảng cáo.listener khi nó nhận giá trị từ thuộc tính người nghe std.

Tên máy chủ và cổng nhà môi giới sẽ quảng cáo cho người sản xuất và người tiêu dùng. Nếu không được đặt,

  • nó sử dụng giá trị cho "người nghe" nếu được cấu hình

Nếu không, nó sẽ sử dụng giá trị trả về từ java.net.InetAddress.getCanonicalHostName().

dừng nhà môi giới Kafka:

bin/kafka-server-stop.sh

khởi động lại môi giới:

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

và bây giờ bạn không nên thấy bất kỳ vấn đề.


Điều này đã giải quyết nó cho tôi, sửa đổi server.propertieslà không đủ cho đến khi tôi khởi động lại nhà môi giới với một deamon được tải lại. Có thể bạn phải biết điều đó, nhưng chắc chắn đã giúp nó được chỉ định trong câu trả lời này
Bossan

Điều này làm việc cho tôi, cảm ơn bạn rất nhiều bro. Tôi đang sử dụngkafka 2.13
Alejandro Herrera

31

Tôi đã chứng kiến ​​vấn đề tương tự trong 2 tuần qua khi làm việc với Kafka và đã đọc bài đăng này của Stackoverflow kể từ đó.

Sau 2 tuần phân tích tôi đã suy luận rằng trong trường hợp của tôi, điều này xảy ra khi cố gắng tạo ra các thông điệp cho một chủ đề không tồn tại .

Kết quả trong trường hợp của tôi là Kafka gửi lại thông báo lỗi nhưng đồng thời tạo ra chủ đề không tồn tại trước đó. Vì vậy, nếu tôi cố gắng tạo lại bất kỳ thông báo nào cho chủ đề đó sau sự kiện này, lỗi sẽ không xuất hiện nữa vì chủ đề đã được tạo.

XIN LƯU Ý: Có thể cài đặt Kafka cụ thể của tôi đã được định cấu hình để tự động tạo chủ đề khi không tồn tại tương tự; điều đó sẽ giải thích tại sao trong trường hợp của tôi, tôi chỉ có thể thấy vấn đề một lần cho mỗi chủ đề sau khi đặt lại các chủ đề: cấu hình của bạn có thể khác và trong trường hợp đó bạn sẽ liên tục nhận được cùng một lỗi.

Trân trọng,

Luca Tampellini


Xin chào Luca. Tôi cũng tự động tạo chủ đề mới. Câu hỏi của tôi là làm thế nào để bạn để người tiêu dùng tự động khám phá chủ đề mới này? Người tiêu dùng của tôi sẽ không làm điều đó. Và sau khi tôi khởi động lại, người tiêu dùng của tôi có thể nhận được tin nhắn mới nhưng tin nhắn gây ra việc tạo chủ đề bị mất.
jchnxu

15

Chúng tôi có xu hướng nhận được thông báo này khi chúng tôi cố gắng đăng ký một chủ đề chưa được tạo. Chúng tôi thường dựa vào các chủ đề để tạo ra một tiên nghiệm trong các môi trường được triển khai của chúng tôi, nhưng chúng tôi có các bài kiểm tra thành phần chạy với trường hợp kafka được neo, bắt đầu sạch sẽ mỗi lần.

Trong trường hợp đó, chúng tôi sử dụng AdminUtils trong thiết lập thử nghiệm của mình để kiểm tra xem chủ đề có tồn tại hay không và tạo nó nếu không. Xem phần tràn ngăn xếp khác này để biết thêm về cách thiết lập AdminUtils.


8

Một khả năng khác cho cảnh báo này (trong 0.10.2.1) là bạn cố gắng thăm dò ý kiến ​​về một chủ đề vừa được tạo và người lãnh đạo cho phân vùng chủ đề này chưa có sẵn, bạn đang ở giữa một cuộc bầu cử lãnh đạo.

Chờ đợi một giây giữa sáng tạo chủ đề và bỏ phiếu là một cách giải quyết.


6

Đối với bất kỳ ai đang cố gắng chạy kafka trên kubernetes và gặp phải lỗi này, đây là điều cuối cùng đã giải quyết nó cho tôi:

Bạn phải:

  1. Thêm vào hostnamethông số kỹ thuật, theo cách đó kafka có thể tự tìm thấy.

hoặc là

  1. Nếu sử dụng hostPort, thì bạn cần hostNetwork: truednsPolicy: ClusterFirstWithHostNet

Lý do cho điều này là vì Kafka cần nói chuyện với chính nó và nó quyết định sử dụng trình nghe / tên máy chủ 'được quảng cáo' để tìm chính nó, thay vì sử dụng localhost. Ngay cả khi bạn có một Dịch vụ trỏ tên máy chủ được quảng cáo vào nhóm, nó sẽ không hiển thị từ bên trong nhóm. Tôi thực sự không biết tại sao lại như vậy, nhưng ít nhất có một cách giải quyết.

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. không làm việc% ERROR: Địa phương: Host thất bại độ phân giải: Kafka-cluster: 9092/1001: Không thể quyết tâm 'Kafka-cluster: 9092': nodename cũng không servname cung cấp, hay không biết đến
Lu32

tôi đã thêm tên máy chủ giống như tên dịch vụ, làm việc cho tôi!
karthikeayan

6

Thêm điều này vì nó có thể giúp đỡ người khác. Một vấn đề phổ biến có thể là một cấu hình sai của advertised.host.name. Với Docker bằng cách sử dụng docker-compose, đặt tên của dịch vụ bên trong KAFKA_ADVERTISED_HOST_NAMEsẽ không hoạt động trừ khi bạn cũng đặt tên máy chủ. docker-compose.ymlthí dụ:

  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

Ở trên mà không hostname: kafkacó thể phát hành LEADER_NOT_AVAILABLEkhi cố gắng kết nối. Bạn có thể tìm thấy một ví dụ về docker-composecấu hình làm việc ở đây


6

Trong trường hợp của tôi, nó hoạt động tốt ở nhà, nhưng nó đã thất bại trong văn phòng, thời điểm tôi kết nối với mạng văn phòng.

Vì vậy, đã sửa đổi config / server.properIES lắng nghe = PLAINTEXT: //: 9092 thành người nghe = PLAINTEXT: // localhost: 9092

Trong trường hợp của tôi, tôi đã nhận được trong khi mô tả Nhóm người tiêu dùng


Tại sao họ không đặt mặc định chính xác, điều này đã giúp tôi.
bột366

5

Nếu bạn đang chạy kafka trên máy cục bộ, hãy thử cập nhật $ KAFKA_DIR / config / server.properies với dòng dưới đây: listeners=PLAINTEXT://localhost:9092và sau đó khởi động lại kafka.


Làm thế nào để tôi làm điều này trên docker-compose.yml?
AC28

Bạn có thể sử dụng tập lệnh shell shell docs.docker.com/compose/compose-file/#entrypoint với docker compose và ghi đè (sed) trình nghe trong server.properies.
MrKulli

3

Tôi đang sử dụng docker-compose để xây dựng container Kafka bằng wurstmeister/kafkahình ảnh. Thêm KAFKA_ADVERTISED_PORT: 9092tài sản vào docker-composetập tin của tôi đã giải quyết lỗi này cho tôi.


3

Vì tôi muốn nhà môi giới kafka của tôi kết nối với các nhà sản xuất và người tiêu dùng từ xa, vì vậy tôi không muốn advertised.listenerbị nhận xét. Trong trường hợp của tôi, (chạy kafka trên kubernetes), tôi phát hiện ra rằng kafka pod của tôi không được gán bất kỳ IP Cluster nào. Bằng cách xóa dòng clusterIP: Nonekhỏi services.yml, các kubernetes gán một ip nội bộ cho kafka pod. Điều này đã giải quyết vấn đề của tôi về LEADER_NOT_AVAILABLE và kết nối từ xa của các nhà sản xuất / người tiêu dùng kafka.


3

Khi LEADER_NOT_AVAILABLE xuất hiện lỗi, chỉ cần khởi động lại trình môi giới kafka:

/bin/kafka-server-stop.sh

theo dõi bởi

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

(Lưu ý: Zookeeper phải được chạy vào thời điểm này, nếu bạn làm khác thì nó sẽ không hoạt động)


Đúng. xảy ra khi kafka được bắt đầu trước và người quản lý vườn thú sau.
panchicore

Tôi đã làm điều này và nó không hoàn toàn giải quyết nó. Điều kỳ lạ là nhà môi giới khởi tạo như thể đó là người lãnh đạo. như trong New leader is 0.
Sammy

2

Dòng dưới đây tôi đã thêm vào config/server.properties, đã giải quyết vấn đề tương tự của tôi ở trên. Hy vọng điều này sẽ giúp, tài liệu khá tốt của nó trong tệp server.properations, hãy cố gắng đọc và hiểu trước khi bạn sửa đổi điều này. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Đối với tất cả những người đang vật lộn với thiết lập ssl Kafka và thấy lỗi LEADER_NOT_AVAILABLE này. Một trong những lý do có thể bị phá vỡ là kho khóa và cửa hàng tin cậy. Trong kho khóa bạn cần có khóa riêng của máy chủ + chứng chỉ máy chủ đã ký. Trong kho ủy thác của khách hàng, bạn cần phải có chứng chỉ CA trung gian để khách hàng có thể xác thực máy chủ kafka. Nếu bạn sẽ sử dụng ssl cho liên lạc giữa các nhà môi giới, bạn cần có cửa hàng tin cậy này cũng được đặt trong máy chủ. Các ưu đãi của các nhà môi giới để họ có thể xác thực lẫn nhau.

Đó là mảnh cuối cùng tôi đã bị mất nhầm và gây cho tôi rất nhiều giờ đau đớn để tìm hiểu lỗi LEADER_NOT_AVAILABLE này có nghĩa là gì. Hy vọng điều này có thể giúp ai đó.


"Khóa riêng của máy chủ" nghĩa là gì? Tôi có khóa CA và chứng chỉ máy chủ đã ký trong kho khóa máy chủ trong khi ở Client Truststore tôi có chứng chỉ CA .. Nhưng tôi vẫn nhận được những lỗi này ..
phaigeim

Xin lỗi tôi có nghĩa là khóa riêng + chứng chỉ. Tôi đã thiết lập một cụm lớn và ở đâu đó trong chuỗi quan liêu đã phạm sai lầm nên một trong những chứng chỉ không khớp với CSR. Đó có thể là lý do khác là tốt. Kiểm tra kỹ xem md5 của khóa riêng, chứng chỉ khớp và chứng chỉ đó có thể được xác minh với cửa hàng tin cậy của bạn. Truststore thường chứa gốc và (các) giấy chứng nhận trung gian
vojtmen

1

Vấn đề được giải quyết sau khi thêm cài đặt trình nghe trên tệp server.properIES nằm trong thư mục config. người nghe = PLAINTEXT: // localhost (hoặc máy chủ của bạn): 9092 Khởi động lại kafka sau khi thay đổi này. Phiên bản được sử dụng 2.11


0

Đối với tôi, điều đó đã xảy ra do một
cổng Docker cấu hình bị mất (9093)
Cổng lệnh Kafka "bin / kafka-console-producer.sh --broker-list localhost: 9092 --topic TopicName"
Tôi đã kiểm tra cấu hình của mình để khớp với cổng và bây giờ mọi thứ đều ổn


0

Đối với tôi, nguyên nhân là do sử dụng một Zookeeper cụ thể không phải là một phần của gói Kafka. Zookeeper đó đã được cài đặt trên máy cho các mục đích khác. Rõ ràng Kafka không làm việc với bất kỳ Zookeeper nào. Chuyển sang Zookeeper đi kèm với Kafka đã giải quyết nó cho tôi. Để không xung đột với Zookeeper hiện tại, tôi đã phải sửa đổi sự hợp nhất của mình để cho Zookeeper lắng nghe trên một cổng khác:

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

0

Các thính giả được quảng cáo như được đề cập trong các câu trả lời trên có thể là một trong những lý do. Các lý do khác có thể là:

  1. Chủ đề có thể không được tạo ra. Bạn có thể kiểm tra điều này bằng cách sử dụngbin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. Kiểm tra máy chủ bootstrap của bạn mà bạn đã cung cấp cho nhà sản xuất để tìm nạp siêu dữ liệu. Nếu máy chủ bootstrap không chứa siêu dữ liệu mới nhất về chủ đề (ví dụ: khi mất yêu cầu quản lý vườn thú). Bạn phải thêm nhiều máy chủ bootstrap.

Ngoài ra, đảm bảo rằng bạn có bộ nghe được quảng cáo được đặt thành IP:9092thay vìlocalhost:9092 . Cái sau có nghĩa là người môi giới chỉ có thể truy cập thông qua localhost.

Khi tôi gặp lỗi, tôi nhớ đã sử dụng PLAINTEXT://<ip>:<PORT>trong danh sách các máy chủ bootstrap (hoặc danh sách môi giới) và nó hoạt động một cách kỳ lạ.

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

0

Đối với tôi, tôi đã không chỉ định id nhà môi giới cho trường hợp Kafka. Nó sẽ nhận được một id mới từ người quản lý vườn thú đôi khi nó khởi động lại trong môi trường Docker. Nếu id nhà môi giới của bạn lớn hơn 1000, chỉ cần chỉ định biến môi trườngKAFKA_BROKER_ID .

Sử dụng này để xem các nhà môi giới, chủ đề và phân vùng.

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

0

Tôi biết điều này đã được đăng lại từ lâu, tôi muốn chia sẻ cách tôi giải quyết nó.
kể từ khi tôi có máy tính xách tay văn phòng của tôi ( VPN và proxy đã được cấu hình).
tôi đã kiểm tra biến môi trường NO_PROXY

> echo %NO_PROXY%


bây giờ nó đã trả về với các giá trị trống, tôi đã đặt NO_PROXY với localhost127.0.0.1

> set NO_PROXY=127.0.0.1,localhost  

nếu bạn muốn nối vào các giá trị hiện có, thì

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

Sau đó, tôi đã khởi động lại người quản lý vườn thú và kafka
làm việc như một cơ duyên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.