私は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
advertised.Host.name
のserver.properties
設定に関連している可能性があります。
起こり得ることは、あなたのプロデューサーが与えられたパーティションのリーダーである人を見つけようとし、そのadvertised.Host.name
とadvertised.port
を見つけ出して接続しようとしているということです。これらの設定が正しく構成されていない場合は、リーダーが利用できないと考える可能性があります。
ここにリストされているすべての推奨事項を試してみました。私にとってうまくいったのはserver.properties
に行き、以下を追加することでした。
port = 9092
advertised.Host.name = localhost
listeners
とadvertised_listeners
はコメントアウトしたままにします。
私はDockerコンテナーとして実行しているkafkaを持っていました、そして同様のメッセージがログにあふれていました。
そしてKAFKA_ADVERTISED_Host_NAME
は 'kafka'に設定されました。
私の場合、エラーの原因は、 'kafka'コンテナー自体の 'kafka'の/etc/hosts
レコードが欠落していることです。
したがって、たとえば、 'kafka'コンテナ内でping kafka
を実行すると、ping: bad address 'kafka'
で失敗します。
Dockerに関しては、この問題はコンテナにhostname
を指定することで解決されます。
それを達成するための選択肢:
私にとってそれを解決したのは、次のようにリスナーを設定することです。
advertised.listeners = PLAINTEXT://my.public.ip:9092
listeners = PLAINTEXT://0.0.0.0:9092
これにより、KAFKAブローカーはすべてのインターフェースをlistenするようになります。
私はkafka_2.12-0.10.2.1を使用しています。
vi config/server.properties
以下の行を追加してください。
listeners=PLAINTEXT://localhost:9092
ブローカーがプロデューサーとコンシューマーにアドバタイズするホスト名とポート。設定されていない場合
。それ以外の場合は、Java.net.InetAddress.getCanonicalHostName()から返された値が使用されます。
kafkaブローカーを停止します。
bin/kafka-server-stop.sh
ブローカーを再起動します。
bin/kafka-server-start.sh -daemon config/server.properties
そして今、あなたは何の問題も見ないはずです。
まだ作成されていないトピックを購読しようとすると、このメッセージが表示される傾向があります。私たちは一般的に私たちのデプロイされた環境で先験的に作成されるトピックに頼りますが、私たちには毎回きれいに始まるdockerized kafkaインスタンスに対して実行されるコンポーネントテストがあります。
その場合は、テスト設定で AdminUtils を使用してトピックが存在するかどうかを確認し、存在しない場合は作成します。 AdminUtilsの設定についての詳細は、この その他の スタックオーバーフローを参照してください。
Kafkaと仕事をしている間、私はこの2週間でこの同じ問題を目撃していて、それ以来ずっとこのStackoverflowの記事を読んでいます。
2週間の分析の後、私は私の場合でこれが存在しないトピックへのメッセージを生成しようとしたときに起こると推測しました。
私の場合の結果は、Kafkaがエラーメッセージを送り返しますが、同時に、以前には存在しなかったトピックを作成します。そのため、このイベントの後にそのトピックに対して再度メッセージを作成しようとすると、エラーは作成されたトピックとしては表示されなくなります。
注意してください。トピックが存在しない場合は、そのトピックを自動的に作成するようにKafkaの特定のインストールが設定されている可能性があります。私は一番最初に一度だけ問題を見ます:あなたの設定は異なるかもしれませんそしてその場合あなたは何度も何度も同じエラーを持ち続けるでしょう。
よろしく、
ルカタンペリーニ
この警告の別の可能性(0.10.2.1)は、作成されたばかりのトピックで投票しようとしたときに、このトピック区画のリーダーがまだ使用可能になっていないということです。
トピックの作成とポーリングの間に1秒待つのが回避策です。
Kubernetesでkafkaを実行しようとしていてこのエラーが発生した場合は、これが最終的に私のために解決したものです。
次のどちらかが必要です。
hostname
を追加します。または
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
それが他の人を助けるかもしれないのでこれを加えること。よくある問題は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
設定 の例はこちら
私の場合、自宅では問題なく動作していましたが、オフィスネットワークに接続した瞬間にはオフィスで失敗していました。
そのため、config/server.propertiesリスナー= PLAINTEXT://:9092をリスナー= PLAINTEXT:// localhost:9092に変更しました。
私の場合は、Consumer Groupについて説明しています。
この下の行をconfig/server.properties
に追加しました。これは、上の問題と同じように私の問題を解決しました。これが助けになることを願っています。それがserver.propertiesファイルにかなりよく文書化されているので、これを変更する前に読んで理解してください。 advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092
LEADER_NOT_AVAILABLEエラーが発生したら、kafkaブローカを再起動してください。
/bin/kafka-server-stop.sh
に続く
/bin/kafka-server-start.sh config/server.properties
(注:Zookeeperはこの時間までに実行されている必要があります。それ以外の方法では動作しません)
私はdocker-composeを使ってwurstmeister/kafka
imageを使ってKafkaコンテナを構築しています。 KAFKA_ADVERTISED_PORT: 9092
ファイルにdocker-compose
プロパティを追加することで、このエラーを解決できました。
ローカルマシンでkafkaを実行している場合は、次の行でlisteners=PLAINTEXT://localhost:9092
を使用して$ KAFKA_DIR/config/server.propertiesを更新してから、kafkaを再起動してください。
私は自分のkafkaブローカーにリモートのプロデューサーやコンシューマーとつながることを望んでいたので、advertised.listener
をコメントアウトしたくはありません。私の場合は、(kubernetesでkafkaを実行して)、私のkafka podにはクラスタIPが割り当てられていないことがわかりました。 services.ymlからclusterIP: None
という行を削除することで、kubernetesはinternal-ipをkafka podに割り当てます。これで私のLEADER_NOT_AVAILABLE問題とkafkaプロデューサー/コンシューマーのリモート接続も解決しました。
Kafka sslセットアップに苦しんでこのLEADER_NOT_AVAILABLEエラーを見ているすべての人のために。壊れる可能性がある理由の1つは、キーストアとトラストストアです。鍵ストアには、サーバーの秘密鍵と署名付きサーバー証明書が必要です。クライアントのトラストストアでは、クライアントがkafkaサーバーを認証できるように、CA証明書を仲介する必要があります。ブローカー間通信にsslを使用する場合は、このトラストストアがブローカーのserver.propertiesにも設定されている必要があります。これにより、それらが互いに認証できるようになります。
私が誤って行方不明になった最後の部分で、このLEADER_NOT_AVAILABLEエラーが何を意味するのかを見つけるのに多くの苦痛な時間を私にもたらしました。うまくいけば、これは誰かに役立つことができます。
Configディレクトリにあるserver.propertiesファイルにリスナー設定を追加した後、問題は解決しました。 listeners = PLAINTEXT:// localhost(またはあなたのサーバー):9092この変更の後でkafkaを再起動してください。使用したバージョン2.11
私にとっては、原因は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
私にとっては、設定ミスが原因で起こりました
Dockerポート(9093)
Kafkaコマンドポート "bin/kafka-console-producer.sh --broker-list localhost:9092--topic TopicName"
私は自分の設定をportと一致するようにチェックしましたが、今ではすべて問題ありません
上記の回答で言及されているように広告されたリスナーは理由の1つである可能性があります。他の考えられる理由は次のとおりです。
bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
を使って確認できます。また、アドバタイズされたリスナーがIP:9092
ではなくlocalhost:9092
に設定されていることを確認してください。後者は、ブローカーがローカルホストを通してのみアクセス可能であることを意味します。
私がエラーに遭遇したとき、私はPLAINTEXT://<ip>:<PORT>
をブートストラップサーバーのリスト(またはブローカーリスト)で使ったことを覚えています、そしてそれは奇妙に働きました。
bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>
私は今日も同じ問題を経験しました。このエラーを回避するために私がしたのは、/etc/hosts
ファイルに微妙な変更を加えることです。
127.0.0.1 localhost localhost.localdomain
行を10.0.11.12 localhost localhost.localdomain
に変更
(10.0.11.12
が、Kafkaサーバーが待機しているホストのIPアドレスの1つであるとします。)