【问题标题】:cant connect to kafka from external machine无法从外部机器连接到 kafka
【发布时间】:2018-01-04 23:03:33
【问题描述】:

我从 Apache Kafka 开始,当我尝试从外部机器连接时遇到问题。

使用下面的配置,如果应用程序和 docker 在同一台机器上运行,则一切正常。

但是当我将应用程序放在机器 A 和机器 B 的 docker 中时,应用程序无法连接。

我的 spring Kafka @Configuration 有这条线到 @Bean consumerFactory 和 producerFactory(想象我的机器使用 docker ip = 10.10.10.10)

props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");

我的 docker 文件是这样的:

version: '2'
services:
zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    ports:
      - 2181:2181
kafka:
    image: wurstmeister/kafka:0.10.1.1
    environment:
        KAFKA_ADVERTISED_HOST_NAME: 0.0.0.0
        KAFKA_ADVERTISED_PORT: 9092
        KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        KAFKA_CREATE_TOPICS: "topic-jhipster:1:1,PROCESS_ORDER:1:1, PROCESS_CHANNEL:1:1"
        JMX_PORT: 9999
        KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=9999"
    ports:
        - 9092:9092
        - 9999:9999
kafka-manager:
    image: sheepkiller/kafka-manager
    ports:
        - 9000:9000
    links:
        - zookeeper
    environment:
        ZK_HOSTS: zookeeper:2181

我得到这个错误:

org.springframework.kafka.core.KafkaProducerException: Failed to send;
nested exception is org.apache.kafka.common.errors.TimeoutException: 
Expiring 1 record(s) for

编辑,添加一些信息..

我认为我缺少关于 zookeeper 的任何配置 .. 因为如果我只有 zookeeper 在我的机器 A 上启动 .. 和机器 B 中的 kafka .. 那工作.. 我只是不知道如何:(

【问题讨论】:

  • 可能是防火墙?
  • @EvgeniDimitrov 不是,没关系。我认为我缺少关于 zookeper 的任何配置 .. 因为如果我只有 zookeeper 在我的机器 A 上启动 .. 和机器 B 中的 kafka .. 那工作.. 我只是不知道如何 :(

标签: spring docker apache-kafka spring-kafka


【解决方案1】:

您需要指定 java.rmi.server.hostname=0.0.0.0

【讨论】:

  • 嗨,你是我的亲戚(戈麦斯)吗? kkk 你说我需要在哪里指定?
  • 可能是的!您可以在 KAFKA_JMX_OPTS 变量中找到该选项
  • 这只是 Kafka 管理器访问 Kafka 的配置。我认为我的问题是我的 producerFactory 缺少一些与 zookeeper 相关的配置。但我不知道是什么
【解决方案2】:

advertised.listeners 设置为 docker 容器主机的主机名或 ip。

environment:
        KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"

正在发生的事情是客户端连接到引导服务器,执行元数据请求以发现集群中的哪个 Kafka 代理要连接到特定主题分区,并获取通告的主机名作为响应 (在您的情况下为 0.0.0.0),仅当一切都在同一台机器上时才有效。

您需要公布一个可以在远程机器上工作的 ip 或主机名,而不是 localhost、127.0.0.1 或 0.0.0.0。也不是 docker 容器的私有内部 IP 或主机名。它必须是外部/公共 IP 或主机名。

另外,advertised.host.nameadvertised.port 在 Kafka 0.10.x 中是不推荐使用的参数,因此即使您使用它们(它们用于向后兼容),您还需要将 advertised.host.name 设置为生产者可以解决的问题并连接到。我建议使用 docker 主机的完全限定主机名或 IP(即 10.10.10.10)。

来自http://kafka.apache.org/0101/documentation.html#brokerconfigs

已弃用:仅在 advertised.listenerslisteners 为 没有设置。请改用advertised.listeners。要发布到的主机名 ZooKeeper 供客户使用。在 IaaS 环境中,这可能需要 与代理绑定的接口不同。如果这是 如果未设置,它将使用 host.name 的值(如果已配置)。 否则它将使用从返回的值 java.net.InetAddress.getCanonicalHostName()。

【讨论】:

    【解决方案3】:

    尝试设置监听器,

    eg: listeners = PLAINTEXT://your.host.name:9092
    

    假设您可以在 kafka 端口上的机器之间远程登录。

    【讨论】:

      【解决方案4】:

      @Krishas 和 @Hans Jespersen 的一些组合

      这是我的 docker yml 的代码:

      version: '2'
      services:
          zookeeper:
              image: wurstmeister/zookeeper:3.4.6
              ports:
                - 2181:2181
          kafka:
              image: wurstmeister/kafka:0.10.1.1
              environment:
                  KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.10:9092
                  KAFKA_ADVERTISED_HOST_NAME: 10.10.10.10
                  KAFKA_ADVERTISED_PORT: 9092
                  KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      

      这需要“PLAINTEXT:// 前缀! 并配置“host_name”+“port”或“listeners”

      下一步是发现我将如何配置其他节点

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        相关资源
        最近更新 更多