web-dev-qa-db-ja.com

リーダーが利用できませんコンソールプロデューサーのKafka

私はKafkaを使おうとしています。すべての設定は正しく行われていますが、コンソールからメッセージを生成しようとすると、次のようなエラーメッセージが表示され続けます。

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

kafkaのバージョン:2.11-0.9.0.0

121
Vishesh

advertised.Host.nameserver.properties設定に関連している可能性があります。

起こり得ることは、あなたのプロデューサーが与えられたパーティションのリーダーである人を見つけようとし、そのadvertised.Host.nameadvertised.portを見つけ出して接続しようとしているということです。これらの設定が正しく構成されていない場合は、リーダーが利用できないと考える可能性があります。

75
Alexey Raga

ここにリストされているすべての推奨事項を試してみました。私にとってうまくいったのはserver.propertiesに行き、以下を追加することでした。

port = 9092
advertised.Host.name = localhost 

listenersadvertised_listenersはコメントアウトしたままにします。

62

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

私の場合、エラーの原因は、 'kafka'コンテナー自体の 'kafka'の/etc/hostsレコードが欠落していることです。
したがって、たとえば、 'kafka'コンテナ内でping kafkaを実行すると、ping: bad address 'kafka'で失敗します。

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

それを達成するための選択肢:

36
Vlad.Bachurin

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

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

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

29

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

vi config/server.properties

以下の行を追加してください。

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

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

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

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

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

bin/kafka-server-stop.sh

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

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

そして今、あなたは何の問題も見ないはずです。

15
Dean Jain

まだ作成されていないトピックを購読しようとすると、このメッセージが表示される傾向があります。私たちは一般的に私たちのデプロイされた環境で先験的に作成されるトピックに頼りますが、私たちには毎回きれいに始まるdockerized kafkaインスタンスに対して実行されるコンポーネントテストがあります。

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

12
Ryan McKay

Kafkaと仕事をしている間、私はこの2週間でこの同じ問題を目撃していて、それ以来ずっとこのStackoverflowの記事を読んでいます。

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

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

注意してください。トピックが存在しない場合は、そのトピックを自動的に作成するようにKafkaの特定のインストールが設定されている可能性があります。私は一番最初に一度だけ問題を見ます:あなたの設定は異なるかもしれませんそしてその場合あなたは何度も何度も同じエラーを持ち続けるでしょう。

よろしく、

ルカタンペリーニ

11
Luca Tampellini

この警告の別の可能性(0.10.2.1)は、作成されたばかりのトピックで投票しようとしたときに、このトピック区画のリーダーがまだ使用可能になっていないということです。

トピックの作成とポーリングの間に1秒待つのが回避策です。

8
Benoit Delbosc

Kubernetesでkafkaを実行しようとしていてこのエラーが発生した場合は、これが最終的に私のために解決したものです。

次のどちらかが必要です。

  1. Kafkaが自分自身を見つけることができるように、ポッド仕様に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
6
Chris

それが他の人を助けるかもしれないのでこれを加えること。よくある問題は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
Paizo

私の場合、自宅では問題なく動作していましたが、オフィスネットワークに接続した瞬間にはオフィスで失敗していました。

そのため、config/server.propertiesリスナー= PLAINTEXT://:9092をリスナー= PLAINTEXT:// localhost:9092に変更しました。

私の場合は、Consumer Groupについて説明しています。

3
Yoga Gowda

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

2
ravibeli

LEADER_NOT_AVAILABLEエラーが発生したら、kafkaブローカを再起動してください。

/bin/kafka-server-stop.sh

に続く

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

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

2
Dan

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

2
Priyanka

ローカルマシンでkafkaを実行している場合は、次の行でlisteners=PLAINTEXT://localhost:9092を使用して$ KAFKA_DIR/config/server.propertiesを更新してから、kafkaを再起動してください。

2
MrKulli

私は自分のkafkaブローカーにリモートのプロデューサーやコンシューマーとつながることを望んでいたので、advertised.listenerをコメントアウトしたくはありません。私の場合は、(kubernetesでkafkaを実行して)、私のkafka podにはクラスタIPが割り当てられていないことがわかりました。 services.ymlからclusterIP: Noneという行を削除することで、kubernetesはinternal-ipをkafka podに割り当てます。これで私のLEADER_NOT_AVAILABLE問題とkafkaプロデューサー/コンシューマーのリモート接続も解決しました。

2
Anum Sheraz

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

私が誤って行方不明になった最後の部分で、このLEADER_NOT_AVAILABLEエラーが何を意味するのかを見つけるのに多くの苦痛な時間を私にもたらしました。うまくいけば、これは誰かに役立つことができます。

1
vojtmen

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

1
Jitray

私にとっては、原因はKafkaパッケージの一部ではなかった特定のZookeeperを使用していたことです。そのZookeeperは他の目的ですでにマシンにインストールされています。どうやらKafkaはZookeeperだけでは動作しません。 Kafkaに付属しているZookeeperに切り替えたことで、問題は解決しました。既存のZookeeperと競合しないようにするには、Zookeeperに別のポートをリッスンさせるように設定を変更する必要がありました。

[[email protected] /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182
0
Onnonymous

私にとっては、設定ミスが原因で起こりました
Dockerポート(9093)
Kafkaコマンドポート "bin/kafka-console-producer.sh --broker-list localhost:9092--topic TopicName"
私は自分の設定をportと一致するようにチェックしましたが、今ではすべて問題ありません

0

上記の回答で言及されているように広告されたリスナーは理由の1つである可能性があります。他の考えられる理由は次のとおりです。

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

また、アドバタイズされたリスナーがIP:9092ではなくlocalhost:9092に設定されていることを確認してください。後者は、ブローカーがローカルホストを通してのみアクセス可能であることを意味します。

私がエラーに遭遇したとき、私はPLAINTEXT://<ip>:<PORT>をブートストラップサーバーのリスト(またはブローカーリスト)で使ったことを覚えています、そしてそれは奇妙に働きました。

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

私は今日も同じ問題を経験しました。このエラーを回避するために私がしたのは、/etc/hostsファイルに微妙な変更を加えることです。

127.0.0.1 localhost localhost.localdomain行を10.0.11.12 localhost localhost.localdomainに変更

10.0.11.12が、Kafkaサーバーが待機しているホストのIPアドレスの1つであるとします。)

0
Minh Danh