リーダーは利用できませんKafka in Console Producer


172

カフカを使おうとしています。
すべての構成は適切に行われていますが、コンソールからメッセージを生成しようとすると、次のエラーが発生し続けます

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


どのバージョンのkafkaを使用していますか?すべての構成が適切であることをどうやって確認しますか?さらに情報を追加してみてください
ノーチラス

私は2.11-0.9.0.0バージョンを使用していますが、動作していたため、すべての構成が適切であると言いました。
Vishesh 2016年

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年のカフカで確認できます
javadba

回答:


93

advertised.host.name設定に関連している可能性がありますserver.properties

何起こる可能性は、あなたの生産者は、そのうちの数字与えられたパーティションのリーダーである人を見つけるためにしようとしていることであるadvertised.host.nameadvertised.port接続するとしようとします。これらの設定が正しく構成されていない場合は、リーダーが利用できないと見なされる可能性があります。


1
これでエラーが修正されましたが、server.propertiesのコメントには、advertised.host.nameが構成されていない場合はhost.nameが使用されると記載されています。そしてhost.nameはserver.propertiesファイルで設定されました。
スパーク氏2016

私は同じ問題を持って、これはカフカ0.9のために私のために働いた
minhas23

3
これを、AWSが生成したパブリックホスト名ではなくIPアドレスに設定すると、私が抱えていた多くの問題が解決しました。
Spechal 2018年

81

ここに記載されているすべての推奨事項を試しました。私のために働いたのは、行ってserver.properties追加することでした:

port = 9092
advertised.host.name = localhost 

そのままlistenersadvertised_listenersしてコメントアウトします。


5
ソリューションは私のために機能します(vikasのソリューションリンク)ちょうどそれを追加したいのserver.propertiesはMAC ファイルにあります/usr/local/etc/kafka/
Edison Q

2
私のために働いたのはこれでした advertised.listeners=PLAINTEXT://my.ip:9092
クローリー氏2017年

14
これは使用しないでください- portadvertised.host.name非推奨の構成です。kafka.apache.org/documentation/#brokerconfigs
ステファン

44

私にとってそれを解決したのは、リスナーを次のように設定することです:

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

これにより、KAFKAブローカーはすべてのインターフェースをlistenします。


4
これは受け入れられる答えになるはずです。マルチノード構成で機能し、非常に理にかなっています。
Piyush Shrivastava

これをapp.yamlファイルで使用できますか?
コーダー

40

私はDockerコンテナーとして実行されているkafkaを持っていて、同様のメッセージがログにあふれていました。
そしてKAFKA_ADVERTISED_HOST_NAME、「カフカ」に設定されました。

私の場合、エラーの理由は/etc/hosts、 'kafka'コンテナー自体に 'kafka'のレコードがないことでした。
したがって、たとえば、ping kafka「kafka」コンテナ内で実行すると、ping: bad address 'kafka'

Dockerに関しては、この問題はhostnameコンテナに指定することで解決されます。

それを達成するためのオプション:


それ自体は回答ではありませんが、将来の参照のために:docker / docker#1143が解決された場合、使用されているOSに関係なく、コンテナーのホストを参照する簡単な方法があります。
Michael Ahlers、2016

wurstmeister / kafka-docker Dockerイメージ(この記事の執筆時点でおそらく最も人気のあるイメージ)を使用している場合は、そのenv
変数の

32

私はkafka_2.12-0.10.2.1を使用しています:

vi config/server.properties

以下の行を追加:

listeners=PLAINTEXT://localhost:9092
  • stdリスナープロパティから値を取得するため、advertised.listenersを変更する必要はありません。

ブローカーがプロデューサーとコンシューマーにアドバタイズするホスト名とポート。設定されていない場合、

  • 構成されている場合は、「リスナー」の値を使用します

それ以外の場合は、から返された値を使用しますjava.net.InetAddress.getCanonicalHostName()

Kafkaブローカーを停止します。

bin/kafka-server-stop.sh

ブローカーを再起動します。

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

そして今、あなたは何の問題も見るべきではありません。


これで解決しましたserver.properties。再読み込みしたデーモンでブローカーを再起動するまで、変更だけでは不十分でした。多分あなたはそれを知っているはずですが、それはこの答えでそれを指定するのに確かに役立ちました
Bossan

これでうまくいきました。本当にありがとうございます。私が使用していますkafka 2.13
アレハンドロエレーラ

31

私はKafkaとの作業中に過去2週間に同じ問題を目撃し、それ以来このStackoverflowの投稿を読んでいます。

2週間の分析の後、私の場合、存在しないトピックへのメッセージを作成しようとしたときにこれが発生したと推定しました。

私の場合の結果は、Kafkaがエラーメッセージを送り返すと同時に、以前には存在しなかったトピックを作成することです。そのため、このイベントの後でそのトピックに対してメッセージを再度生成しようとすると、作成されたトピックとしてエラーが表示されなくなります。

注意:特定のKafkaインストールが、同じトピックが存在しない場合にトピックを自動的に作成するように構成されている可能性があります。これは、私の場合、トピックをリセットした後、すべてのトピックについて一度だけ問題を確認できる理由を説明しているはずです。構成が異なる場合があり、その場合、同じエラーが繰り返し発生し続けます。

よろしく、

ルカ・タンペリニ


こんにちはルカ。新しいトピックも自動作成しています。私の質問は、消費者にどのようにしてこの新しいトピックを自動発見させることができるかです。私の消費者はそれをしません。そして、コンシューマーを再起動した後、新しいメッセージを受信できますが、トピック作成の原因となったメッセージは失われます。
jchnxu

15

まだ作成されていないトピックを購読しようとすると、このメッセージが表示される傾向があります。通常、デプロイされた環境で演繹的に作成されるトピックに依存しますが、Docker化されたkafkaインスタンスに対して実行されるコンポーネントテストがあり、毎回クリーンに開始されます。

その場合、テスト設定でAdminUtilsを使用して、トピックが存在するかどうかを確認し、存在しない場合は作成します。AdminUtilsの設定の詳細については、この他のスタックオーバーフローを参照してください。


8

この警告の別の可能性(0.10.2.1)は、作成されたばかりのトピックで投票しようとしたが、このトピックパーティションのリーダーがまだ利用できず、リーダーシップ選挙の真っ最中です。

トピックの作成とポーリングの間に1秒待機することは、回避策です。


6

kubernetesでkafkaを実行しようとしてこのエラーが発生した場合、最終的にこれが解決されました。

次のいずれかを行う必要があります。

  1. hostnameポッド仕様に追加すると、カフカは自分自身を見つけることができます。

または

  1. を使用しているhostPort場合はhostNetwork: truednsPolicy: 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'の解決に失敗しました:ノード名もサービス名も指定されていないか、不明
Lu32

私はサービス名と同じホスト名を追加しました、私のために働いています!
karthikeayan 2018年

6

他の人を助けるかもしれないので、これを追加します。一般的な問題は、の設定ミスである可能性がありadvertised.host.nameます。Dockerでdocker-compose設定を使用すると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を以下の行で更新してから、kafka listeners=PLAINTEXT://localhost:9092を再起動してください。


docker-compose.ymlでこれを行うにはどうすればよいですか?
AC28

エントリーポイントシェルスクリプトdocs.docker.com/compose/compose-file/#entrypoint をserver.propertiesのdocker composeおよびoverwrite(sed)リスナーで使用できます。
MrKulli

3

docker-composeを使用して、wurstmeister/kafkaイメージを使用してKafkaコンテナーを構築しています。ファイルにKAFKA_ADVERTISED_PORT: 9092プロパティを追加すると、docker-composeこのエラーが解決しました。


3

kafkaブローカーがリモートのプロデューサーおよびコンシューマーと接続することを望んでいたので、advertised.listenerコメントアウトしたくありません。私の場合(kubernetesでkafkaを実行)、私のkafkaポッドにクラスターIPが割り当てられていないことがわかりました。clusterIP: Noneservices.ymlから行を削除することにより、kubernetesは内部IPをkafkaポッドに割り当てます。これにより、LEADER_NOT_AVAILABLEの問題と、kafkaプロデューサー/コンシューマーのリモート接続も解決されました。


3

LEADER_NOT_AVAILABLEエラーがスローされたら、kafkaブローカーを再起動するだけです。

/bin/kafka-server-stop.sh

に続く

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

(注:この時間までにZookeeperが実行されている必要があります。それ以外の場合は動作しません)


はい。カフカが最初に開始され、その後飼育係が開始したときに発生します。
panchicore

私はこれをしました、そしてそれはそれを完全に解決しません。奇妙なのは、ブローカーがリーダーであるかのように初期化することです。のようにNew leader is 0
サミー

2

私が追加したこの下の行はconfig/server.properties、上記の問題と同様に私の問題を解決しました。これが役立つことを願って、server.propertiesファイルにかなりよく文書化されています。これを変更する前に、読んで理解してください。 advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092


1

Kafka sslセットアップで苦労していて、このLEADER_NOT_AVAILABLEエラーが表示されているすべての人。壊れる可能性のある理由の1つは、キーストアとトラストストアです。キーストアには、サーバーの秘密鍵と署名済みサーバー証明書が必要です。クライアントのトラストストアでは、クライアントがkafkaサーバーを認証できるように、中間CA証明書が必要です。ブローカー間の通信にsslを使用する場合は、ブローカーのserver.propertiesにもこのトラストストアを設定して、ブローカーが相互に認証できるようにする必要があります。

その最後のピースは、私が誤って見逃していたため、このLEADER_NOT_AVAILABLEエラーが何を意味するのかを見つけるのに多くの苦痛な時間を引き起こしました。うまくいけば、これは誰かを助けることができます。


「サーバーの秘密鍵」とはどういう意味ですか?私は、CA証明書を持つトラストストアクライアントにおける一方のサーバーキーストア内のCAキーと署名付きサーバ証明書を持っている..しかし、まだ、私はこれらのエラーを取得しています...
phaigeim

申し訳ありませんが、秘密鍵と証明書を意味していました。大規模なクラスターをセットアップしていて、官僚チェーンのどこかで誤りがあったため、証明書の1つがCSRと一致していません。それも他の理由かもしれません。秘密鍵のmd5と証明書が一致し、その証明書がトラストストアで検証できることを再確認してください。トラストストアには通常、ルート証明書と中間証明書が含まれています
vojtmen

1

configディレクトリにあるserver.propertiesファイルにリスナー設定を追加すると、問題が解決します。listeners = PLAINTEXT:// localhost(またはサーバー):9092この変更後、kafkaを再起動します。使用されているバージョン2.11


0

私にとって、それはミスの設定が原因に発生した
(9093)ドッカーポート
カフカのコマンドポート「ビン/ kafka-console-producer.sh --brokerリストは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つである可能性があります。その他の考えられる理由は次のとおりです。

  1. トピックが作成されていない可能性があります。これを使用してこれを確認できますbin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. メタデータを取得するためにプロデューサーに指定したブートストラップサーバーを確認します。ブートストラップサーバーにトピックに関する最新のメタデータが含まれていない場合(たとえば、Zookeeperの主張を失った場合)。複数のブートストラップサーバーを追加する必要があります。

また、アドバタイズされたリスナーがのIP:9092代わりに設定されていることを確認してくださいlocalhost:9092。後者は、ブローカーがlocalhostを介してのみアクセスできることを意味します。

エラーが発生したときPLAINTEXT://<ip>:<PORT>、ブートストラップサーバーのリスト(またはブローカーリスト)で使用したことを覚えており、奇妙に機能しました。

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

0

私にとって、KafkaインスタンスのブローカーIDは指定しませんでした。Docker環境で再起動すると、zookeeperから新しいIDを取得することがあります。ブローカーIDが1000より大きい場合は、環境変数を指定するだけですKAFKA_BROKER_ID

これを使用して、ブローカー、トピック、およびパーティションを表示します。

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

0

これは長い間投稿されたことを知っています。解決方法を共有したいと思います。
私は私のオフィスのラップトップを持っているので(VPNとプロキシが構成されました)。
私は環境変数NO_PROXYをチェックしました

> echo %NO_PROXY%

空の値で返さ
れました。今度はlocalhost127.0.0.1で NO_PROXYを設定しました

> set NO_PROXY=127.0.0.1,localhost  

既存の値に追加する場合は、

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

この後、飼育係を再起動し、カフカ
は魅力のように働きました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.