【问题标题】:Java & Kafka: Connection to node 999 could not be established. Broker may not be availableJava & Kafka:无法建立到节点 999 的连接。经纪人可能不可用
【发布时间】:2018-07-05 03:19:45
【问题描述】:

我的 docker-compose.yml 是

version: "2.1"
services:
  pg-master:
    image: postgres-9.6:3
    ports:
     - "5432:5432"
    environment:
     - VIRTUAL_HOST=postgres.local
  web:
    build: .
    links:
      - pg-master:postgres.local
    ports:
     - "8080:8080"
  zookeeper:
    image: jplock/zookeeper:3.4.6
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:1.0.0
    ports:
      - "9092:9092"
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=localhost
      - KAFKA_ADVERTISED_PORT=9092
      - KAFKA_CREATE_TOPICS=TestTopic1:3:1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_BROKER_ID=999
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

在 web docker 容器中,java kafka 生产者:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
this.kafkaProducer = new KafkaProducer<String, String>(props);

但是,我得到了[kafka-producer-network-thread | producer-2] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-2] Connection to node -1 could not be established. Broker may not be available.

不知道为什么。欢迎任何建议。非常感谢。

更新

我可以在kafka docker容器内外通过bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TestTopic1 --from-beginningbin/kafka-console-producer.sh --broker-list localhost:9092 --topic TestTopic1产生和消费消息。

docker 容器内的localhost 是什么?

更新

现在,我将 Kafka Java 生产者配置的 KAFKA_ADVERTISED_HOST_NAMEbootstrap.servers 手动更改为 docker 主机 ip(由 ifconfig 获取)。 现在,它正在工作。现在,我不知道如何获取 docker host ip 并通过程序或 bash 自动将其设置在 docker-compose 文件中。

【问题讨论】:

  • 我使用您使用的 zookeper 和 kafka 配置运行了 docker-compose。我只将 KAFKA_ADVERTISED_HOST_NAME 更改为 docker IP。我可以运行 KafkaProducer(您的代码)向 Kakfa 发送消息而不会出错。这可能是因为 Kafka 代理尚未启动。检查 docker-compose 日志以查看 Kafka 代理是否已正常启动。
  • @ShankarPS kafka 已启动。似乎我的 java 程序无法从 docker 容器内部访问 zookeeper 和 kafka。 Java 程序正在 docker 容器中运行。
  • 尝试修改 docker-compose.yml 中的 KAFKA_ADVERTISED_HOST_NAME 以匹配您的 docker 主机 IP。
  • @ShankarPS docker 主机 ip 是什么?
  • 在Docker终端-$docker-machine ip运行这个命令

标签: java docker apache-kafka docker-compose


【解决方案1】:

我们能够通过将/etc/hosts 从主机复制到 Docker 容器来解决此问题。显然 Kubernetes DNS services 无法正确处理我们的设置。

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2018-04-11
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多