Kafkaをdocker-composeで初めて動作させようとしています。アプリケーションは、Dockerなしで正常に実行されます。しかし、Dockerでは、以下に説明するエラーが発生します。 Kafkaがこのエラーをスローする理由は何ですか?
エラー:
email-service_1 | 2018-12-01 14:32:02.448 WARN 1 --- [ntainer#0-0-C-1] oakcNetworkClient:[Consumer clientId = consumer-2、groupId = kafka] 1パーティションに一致するリスナーのないリーダーブローカーがあります、[email-token-0]を含む
私のdocker-compose config:
version: '3.3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
command: [start-kafka.sh]
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_Host_NAME: 192.168.23.134
KAFKA_CREATE_TOPICS: "email-token:1:1"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "9092:9092"
depends_on:
- zookeeper
email-service:
build: ./email-service
environment:
SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:9092
ports:
- "8081:8081"
depends_on:
- kafka
質問へのコメントで述べられているように、問題はKafkaブローカーの広告名にあるようです。 docker-composeによると、192.168.23.134
を使用する必要がありますが、メールサービスはkafka:9092
を使用しています。このdocker-composeで試すことができます。 wurstmeisterサービスを最新のZookeeperとconfluentinc
が提供するKafkaに置き換え、メールサービスを追加しました。
---
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_Host://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_Host:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
email-service:
build: ./email-service
environment:
SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:29092
ports:
- "8081:8081"
depends_on:
- kafka
advertised.listeners:クライアントが使用するためにZooKeeperに公開するリスナー(リスナー構成プロパティーと異なる場合)。 IaaS環境では、これはブローカーがバインドするインターフェースと異なる必要がある場合があります。これが設定されていない場合、リスナーの値が使用されます。リスナーとは異なり、0.0.0.0メタアドレスをアドバタイズすることは無効です。
KAFKA_ADVERTISED_Host_NAME
は廃止されているため、代わりにKAFKA_ADVERTISED_LISTENERS
を使用することをお勧めします。 KAFKA_ADVERTISED_LISTENERS
の詳細については、 here を確認してください。
[コンテキスト]
https://github.com/wurstmeister/kafka-docker のレジストリを使用して、kafkaクライアントでdocker composeを実行しようとしていますkafka単一のブローカーと、各パーティションが1でレプリケーションファクターが1の3つのトピックを含むクラスター。
この素晴らしいリンクは、1つのブローカーとkafkaクラスター、複数のブローカーとkafkaクラスターの接続性を説明し、すべてdockerを使用するリスナーに関する概念もご覧ください。 https://github.com/wurstmeister/kafka-docker/wiki/Connectivity
[結果]
docker-compose up --force-recreate --build
を初めて実行すると、すべてが正常に実行されます。
トピックはKAFKA_CREATE_TOPICS
を使用して自動的に作成され、kafkaプロデューサーとコンシューマーを問題なく使用できます。
トピックのリスト:bin/kafka-topics.sh --list --bootstrap-server localhost:9092
producer:bin/kafka-console-producer.sh --broker-list localhost:9092 --topic productadvisor_sales_dev
消費者:bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic productadvisor_sales_dev --from-beginning
その後、docker-compose stop
を実行するたびに、docker-compose up --force-recreate --build
を使用して再起動し、データを生成しようとすると、次のエラーメッセージが表示されます...
エラーメッセージ:[2019-09-23 19:41:33,037] WARN [Producer clientId=console-producer] 1 partitions have leader brokers without a matching listener, including [productadvisor_purchase_dev-0] (org.Apache.kafka.clients.NetworkClient)
[回答]
KAFKA_BROKER_ID
(たとえば、= 1)の値を指定する必要があるようです。これにより、zookeeperは、古いブローカーにバインドされているためリスナーを持たない新しいブローカーを作成しようとしません。
[コード]
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_Host: localhost
KAFKA_PORT: 9092
KAFKA_ADVERTISED_Host_NAME: localhost
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "productadvisor_sales_dev:1:1,productadvisor_stock_dev:1:1,productadvisor_purchase_dev:1:1"
depends_on:
- zookeeper
command: [start-kafka.sh]
[一部のドキュメント]
NB
kafka、zookeeper、brokerの内部動作に関する詳細情報と、それを指定する必要がある理由、私が--force-recreate --buildを実行しても情報が保持される理由がある場合は、heしないでください。私はkafkaが初めてで、これはstackoverflowに関する最初の完全な投稿の1つです:)
乾杯!