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


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.name와 advertised.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 

남겨 listeners및 advertised_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: 9092내 docker-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.