콘솔 생산자에서 리더를 사용할 수 없음


172

Kafka를 사용하려고합니다.
모든 구성이 올바르게 완료되었지만 콘솔에서 메시지를 생성하려고하면 다음 오류가 계속 발생합니다.

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

카프카 버전 : 2.11-0.9.0.0


어떤 카프카 버전을 사용하고 있습니까? 모든 구성이 올바른지 어떻게 알 수 있습니까? 더 많은 정보를 추가하십시오
Nautilus

2.11-0.9.0.0 버전을 사용하고 있으며 모든 구성이 작동하기 때문에 적절하다고 말했습니다.
Vishesh

1
@Vishesh 다음 명령의 결과를 제공 할 수 있습니까? ./bin/kafka-topics.sh --zookeeper localhost : 2181 --describe --topic yourTopicName
avr

2
나에게도 같은 오류. 리더 ./bin/kafka-topics.sh --zookeeper <ip> : 2181 --describe --topic yourTopicName을 받고 있지만 생산자에게 메시지를 보내는 동안 오류 LEADER_NOT_AVAILABLE이 발생합니다.
Vilva

2
2.2.02019
카프카

답변:


93

advertised.host.name설정 과 관련이있을 수 있습니다 server.properties.

무엇 일어날 수있는 당신의 프로듀서, 리더는 주어진 파티션 누구인지 찾기 위해 파악하려고하는 것입니다 advertised.host.nameadvertised.port연결하고 시도합니다. 이러한 설정이 올바르게 구성되지 않으면 리더를 사용할 수 없다고 생각할 수 있습니다.


1
그것은 나를 위해 오류를 수정했지만 .. server.properties의 의견에 따르면 advertised.host.name이 구성되어 있지 않으면 host.name을 사용한다고 말합니다. 그리고 host.name은 server.properties 파일에서 구성되었습니다.
Mr Spark

저도 같은 문제를 가지고 이것은 카프카 0.9를 위해 나를 위해 일한
minhas23

3
이것을 AWS 생성 퍼블릭 호스트 이름 대신 내 IP 주소로 설정하면 많은 문제가 해결되었습니다.
Spechal

81

여기에 나열된 모든 권장 사항을 시도했습니다. 나를 위해 일한 것은 가서 server.properties추가하는 것이 었습니다 .

port = 9092
advertised.host.name = localhost 

남겨 listenersadvertised_listeners주석.


5
솔루션은 저에게 효과적입니다 ( vikas 'solution link ) MAC server.properties파일 에 저를 위해 추가하고 싶습니다/usr/local/etc/kafka/
Edison Q

2
나를 위해 일한 것은 이것이었다 advertised.listeners=PLAINTEXT://my.ip:9092
Crowley Mr.

14
DO NOT USE THIS는 - port, advertised.host.nameCONFIGS을 사용되지 않습니다. kafka.apache.org/documentation/#brokerconfigs
Stephane

44

나를 위해 해결 한 것은 다음과 같이 청취자를 설정하는 것입니다.

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

이로 인해 KAFKA 브로커는 모든 인터페이스를 청취합니다.


4
이것이 정답입니다. 다중 노드 구성에 적합하며 많은 의미가 있습니다.
Piyush Shrivastava

app.yaml 파일에서 이것을 사용할 수 있습니까?
코더

40

도커 컨테이너로 kafka를 실행하고 비슷한 메시지가 로그에 넘쳐났습니다.
그리고 KAFKA_ADVERTISED_HOST_NAME'kafka'로 설정되었습니다.

필자의 경우 오류의 원인 /etc/hosts은 'kafka'컨테이너 자체에서 'kafka'에 대한 누락 된 레코드였습니다.
예를 들어 ping kafka'kafka'컨테이너 내부 에서 실행 하면 실패합니다.ping: bad address 'kafka'

Docker와 관련 하여이 문제는 hostname컨테이너 를 지정하여 해결됩니다 .

그것을 달성하기위한 옵션 :


그 자체로 는 답이 아니지만 나중에 참조 할 수 있습니다 : docker / docker # 1143 이 해결되면 사용되는 OS에 관계없이 컨테이너의 호스트를 쉽게 참조 할 수있는 방법이 있습니다.
Michael Ahlers

당신이 사용하는 경우 wurstmeister / 카프카 - 고정 표시기의 (이 글을 쓰는 시간을 기준으로 아마 가장 인기있는 중 하나 인) 고정 표시기 이미지를, 여기에 메모를 참조 하는 ENV var에 설정하는 이유에 대해
RyanQuey

32

kafka_2.12-0.10.2.1을 사용하고 있습니다.

vi config/server.properties

아래 줄을 추가하십시오 :

listeners=PLAINTEXT://localhost:9092
  • advertised.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
Alejandro Herrera

31

Kafka와 함께 일하면서 지난 2 주 동안 같은 문제를 목격했으며 그 이후로이 Stackoverflow의 게시물을 읽었습니다.

2 주 동안의 분석 후에 나는 존재하지 않는 주제에 대한 메시지를 생성하려고 할 때 이것이 발생 한다고 추론했습니다 .

필자의 경우 결과는 Kafka가 오류 메시지를 다시 보내지 만 동시에 존재하지 않는 주제를 만듭니다. 따라서이 이벤트 이후에 해당 주제에 대한 메시지를 다시 생성하려고하면 작성된 주제로 더 이상 오류가 표시되지 않습니다.

참고 : 특정 Kafka 설치가 동일한 주제가 없을 때 주제를 자동으로 생성하도록 구성되었을 수 있습니다. 그것은 내 경우에 주제를 재설정 한 후 모든 주제에 대해 한 번만 문제를 볼 수있는 이유를 설명해야합니다. 구성이 다를 수 있으며이 경우 동일한 오류가 계속 발생합니다.

문안 인사,

루카 탐 펠리니


안녕하세요 루카. 또한 새로운 주제를 자동 생성하고 있습니다. 제 질문은 소비자가이 새로운 주제를 어떻게 자동으로 발견하게합니까? 내 소비자는 그렇게하지 않을 것입니다. 그리고 소비자를 다시 시작한 후 새 메시지를 수신 할 수 있지만 주제를 생성 한 메시지는 손실됩니다.
jchnxu

15

아직 생성되지 않은 주제를 구독하려고 할 때이 메시지가 나타납니다. 우리는 일반적으로 배포 된 환경에서 선험적으로 생성 할 주제에 의존하지만, 매번 깨끗하게 시작되는 dockerized kafka 인스턴스에 대해 실행되는 구성 요소 테스트가 있습니다.

이 경우 테스트 설정에서 AdminUtils 를 사용 하여 주제가 존재하는지 확인하고 존재하지 않는 경우 작성합니다. AdminUtils 설정에 대한 자세한 내용은이 다른 스택 오버 플로우를 참조하십시오 .


8

이 경고 (0.10.2.1)의 또 다른 가능성은 방금 생성 한 주제에 대해 폴링을 시도하고이 주제-파티션의 리더를 아직 사용할 수 없으며, 귀하는 지도부 선거 중입니다.

주제 작성과 폴링 사이에 잠시 대기하는 것이 해결 방법입니다.


6

kubernetes에서 kafka를 실행하려고 하고이 오류가 발생하는 사람은 이것이 마침내 나를 위해 해결 한 것입니다.

다음 중 하나를 수행해야합니다.

  1. hostname포드 사양에 추가 하면 kafka가 자동으로 찾을 수 있습니다.

또는

  1. 사용하는 경우 hostPort, 당신이 필요로 hostNetwork: true하고dnsPolicy: ClusterFirstWithHostNet

그 이유는 Kafka가 자체적으로 대화해야하기 때문에 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'를 확인하지 못했습니다 : nodename 또는 servname 제공 또는 알 수 없음
Lu32

서비스 이름과 동일한 호스트 이름을 추가하여 나를 위해 일했습니다!
karthikeayan

6

다른 사람들에게 도움이 될 수 있으므로 이것을 추가하십시오. 일반적인 문제는 구성이 잘못되었을 수 있습니다 advertised.host.name. docker-compose를 사용하는 Docker의 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 listeners = PLAINTEXT : // : 9092를 listeners = PLAINTEXT : // localhost : 9092로 수정했습니다.

제 경우에는 소비자 그룹을 설명하는 중이었습니다.


도대체 그들이 올바른 기본값을 설정하지 않은 이유는 도움이되었습니다.
powder366

5

로컬 컴퓨터에서 kafka를 실행중인 경우 아래 행으로 $ KAFKA_DIR / config / server.properties를 업데이트 listeners=PLAINTEXT://localhost:9092한 다음 kafka를 다시 시작하십시오.


docker-compose.yml에서 어떻게합니까?
AC28

server.properties의 docker compose 및 overwrite (sed) 리스너와 함께 시작점 쉘 스크립트 docs.docker.com/compose/compose-file/#entrypoint 를 사용할 수 있습니다 .
MrKulli

3

wurstmeister/kafka이미지를 사용하여 Kafka 컨테이너를 빌드하기 위해 docker-compose를 사용하고 있습니다. KAFKA_ADVERTISED_PORT: 9092docker-compose파일에 속성을 추가하면 이 오류가 해결되었습니다.


3

kafka 브로커가 원격 생산자 및 소비자와 연결되기를 원했기 때문에 advertised.listener주석을 달고 싶지 않습니다 . 필자의 경우 (kubernetes에서 kafka를 실행) kafka 포드에 클러스터 IP가 할당되지 않았다는 것을 알았습니다. clusterIP: Noneservices.yml 에서 라인 을 제거하면 kubernetes는 내부 IP를 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는이 시간까지 실행해야합니다. 그렇지 않으면 작동하지 않습니다)


예. kafka를 처음 시작하고 사육사를 시작하면 발생합니다.
panchicore

나는 이것을했고 그것을 해결하지는 못한다. 이상한 점은 브로커가 마치 리더 인 것처럼 초기화한다는 것입니다. 에서와 같이 New leader is 0.
Sammy

2

에 추가 된 아래 줄은 config/server.properties위의 문제와 비슷한 문제를 해결했습니다. 이것이 server.properties 파일에 잘 문서화되어 있으므로 이것을 수정하기 전에 읽고 이해하려고 노력하십시오. advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Kafka ssl 설정에 어려움을 겪고 LEADER_NOT_AVAILABLE 오류가 발생하는 모든 사람들에게. 손상 될 수있는 이유 중 하나는 키 저장소와 신뢰 저장소입니다. 키 저장소에는 서버의 개인 키 + 서명 된 서버 인증서가 있어야합니다. 클라이언트 신뢰 저장소에는 클라이언트가 kafka 서버를 인증 할 수 있도록 중간 중재 CA 인증서가 있어야합니다. 브로커 간 통신에 ssl을 사용하려면 브로커의 server.properties에이 신뢰 저장소도 설정해야 서로를 인증 할 수 있습니다.

마지막 부분은 실수로 누락되어이 LEADER_NOT_AVAILABLE 오류가 무엇을 의미하는지 알아내는 데 많은 고통스러운 시간을 일으켰습니다. 잘하면 이것은 누군가를 도울 수 있습니다.


"서버의 개인 키"는 무엇을 의미합니까? 클라이언트 키 저장소에는 CA 키가 있고 서명 된 서버 인증서가있는 반면 클라이언트 신뢰 저장소에는 CA 인증서가 있습니다. 그러나 여전히 이러한 오류가 발생합니다.
phaigeim

죄송합니다. 개인 키 + 인증서를 의미했습니다. 나는 큰 클러스터를 설정하고 있었고 관료 체인의 어딘가에서 실수로 인증서 중 하나가 CSR과 일치하지 않았습니다. 그것은 다른 이유 일 수도 있습니다. 개인 키의 md5, 인증서가 일치하고 해당 인증서를 신뢰 저장소에서 확인할 수 있는지 다시 확인하십시오. Truststore는 일반적으로 루트 및 중간 인증서를 포함합니다.
vojtmen

1

config 디렉토리에있는 server.properties 파일에서 리스너 설정을 추가 한 후 문제가 해결되었습니다. listeners = PLAINTEXT : // localhost (또는 서버) : 9092이 변경 후 kafka를 다시 시작하십시오. 사용 된 버전 2.11


0

저에게는 구성 누락 구성으로 인해 발생했습니다.
Docker 포트 (9093)
Kafka 명령 포트 "bin / kafka-console-producer.sh --broker-list localhost : 9092 --topic TopicName"
구성이 포트와 일치하는지 확인했습니다. 이제 다 괜찮아


0

나를 위해 원인은 Kafka 패키지의 일부가 아닌 특정 Zookeeper를 사용하고있었습니다. 그 Zookeeper는 이미 다른 목적으로 기계에 설치되었습니다. 분명히 Kafka는 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. 후자는 브로커가 로컬 호스트를 통해서만 액세스 할 수 있음을 의미합니다.

오류가 발생했을 때 PLAINTEXT://<ip>:<PORT>부트 스트랩 서버 목록 (또는 브로커 목록)을 사용하고 이상하게 작동했습니다.

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

0

나를 위해 Kafka 인스턴스에 브로커 ID를 지정하지 않았습니다. Docker 환경에서 다시 시작할 때 동물원 관리자로부터 새로운 ID를 얻습니다. 브로커 ID가 1000보다 큰 경우 환경 변수를 지정하십시오 KAFKA_BROKER_ID.

이를 사용하여 브로커, 주제 및 파티션을보십시오.

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

0

나는 이것이 오래 전 게시되었다는 것을 알고 있습니다. 내가 그것을 어떻게 해결했는지 공유하고 싶습니다. 사무실 용 랩톱
이 있기 때문에 ( VPN 및 프록시 구성) 환경 변수 NO_PROXY를 확인했습니다.

> echo %NO_PROXY%

이 빈 값을 반환
지금 내가 가진 NO_PROXY를 설정 한 로컬 호스트 127.0.0.1을

> set NO_PROXY=127.0.0.1,localhost  

기존 값에 추가하려면

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

이 후, 나는 사육사를 다시 시작했고 kafka
는 매력처럼 일했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.