web-dev-qa-db-ja.com

Kafkaパーティションには、一致するリスナーのないリーダーブローカーがあります

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
10
user2997204

質問へのコメントで述べられているように、問題は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 を確認してください。

9
lloiacono

[コンテキスト]

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つです:)

乾杯!

0
IanMars