【问题标题】:Connect to Kafka inside VirtualBox在 VirtualBox 中连接到 Kafka
【发布时间】:2018-02-14 22:08:07
【问题描述】:

我在从我的主机 (Windows) 连接到安装了 Kafka 的来宾 (Linux) 时遇到问题。

我已经设置了一个安装了 Confluent 工具的虚拟机(带有 VirtualBox)。在这个虚拟机中,我运行命令:

confluent start schema-registry

它启动 zookeeper、kafka 和 schema-registry。

在这个VM下,我可以运行

kafka-console-producer --broker-list localhost:9092 --topic test

kafka-console-consumer --bootstrap-server localhost:9092 --topic test

一切正常,我可以生成和接收消息。

然而,我的目标是能够从我的主机生成和使用消息,所以我设置了这个端口转发规则:

在我的 Windows 中,我希望这个命令可以工作:

bin\windows\kafka-console-producer.bat --broker-list 127.0.0.1:9092 --topic test

但我得到的只是这个:

ERROR Error when sending message to topic test with key: null, value: 3 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for test-0: 1529 ms has passed since batch creation plus linger time 

我尝试了很多不同的方法,但仍然找不到解决方案....有什么想法吗?

【问题讨论】:

    标签: apache-kafka virtualbox kafka-consumer-api kafka-producer-api


    【解决方案1】:

    Guest 和 Host 之间似乎存在主机名差距。 Linux 来宾有什么主机名?

    当生产者/消费者访问 Kafka 代理时,Kafka 代理以默认设置返回其用于数据生产者或消费者的主机名。因此生产者/消费者需要将代理的主机名解析为 IPAddress。

    对于返回任意主机名的代理,请使用advertised.listeners 设置。

    详情在the "advertised.listeners" configuration docs

    【讨论】:

    • 非常感谢您的帮助,我真的很迷茫。 Linux 来宾的主机名是 kafka-VirtualBox。在advertising.listeners 中,我现在有这个:advertising.listeners=PLAINTEXT://kafka-VirtualBox:9092 在 Windows 主机中,我将这一行添加到主机文件中:127.0.0.1 kafka-VirtualBox 我仍然有相同的虽然错误....
    • 嗯...那么,就需要一步步解决了。首先,确认“kafka commands enable to access kafka-VirtualBox吗?”由 kafka-topics.bat 提供。
    • 我在路上发帖了。然后,它需要逐步解决。首先,确认“kafka commands enable to access kafka-VirtualBox吗?”通过 kafka-broker-api-versions.bat。如果命令无法访问kafka-VirtualBox,这个问题是虚拟盒子网络设置问题。如果命令可以访问kafka-VirtualBox,这个麻烦就变成了kafka broker或者client设置问题。
    • 非常感谢您的帮助。解决方案是将这个:127.0.0.1 kafka-VirtualBox 添加到我的 Windows 主机文件中。您说我的主机无法解析我的访客主机名可能是对的。可以肯定的是,我从头开始重新安装了一个新来宾,并且通过使用默认的融合配置,如果您重定向 zookeeper、kafka 和 schema-registry 端口,并且如果您将此行添加到主机的主机文件中,一切都会正常工作。再次感谢!
    • 想在我的帖子中添加一个链接,以补充原始答案boristyukin.com/connecting-to-kafka-on-virtualbox-from-windows
    【解决方案2】:

    我试图设置类似的东西。尽管为 Kafka 和 Zookeeper 设置适当的虚拟网络可能会更好,但我确实坚持并想分享我的个人方法。

    我可以使用运行在 VirtualBox Linux 客户机本身上的 Kafka 和 Zookeeper,以及在该 Linux 客户机上运行的基于 docker 的解决方案。这是我在来宾内部使用的docker-compose.yml

    version: '3'
    
    services:
    
      zookeeper:
        image: "wurstmeister/zookeeper"
        ports:
          - "2181:2181"
    
      kafka:
        image: "wurstmeister/kafka"
        ports:
          - "9092:9092"
        environment:
          KAFKA_ADVERTISED_HOST_NAME: "localhost"
          KAFKA_CREATE_TOPICS: "test:1:1"
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    

    这里的关键是KAFKA_ADVERTISED_HOST_NAME,它做了一个肮脏的小把戏,可以很好地与 VirtualBox 中默认的基于 NAT 的网络配合使用(假设你已经修补了 21819092像OP一样通过)。通过这个技巧,VirtualBox Host 操作系统上的任何消费者或生产者都将从 Kafka 获悉它位于 "localhost",它解析为 Host,但是因为端口在主机被修补到客人,事情最终在正确的地方。

    在 1.x 中执行相同操作的正确方法是使用 Advertised Listeners 属性,但原理保持不变。


    作为参考,这是我的 VirtualBox 设置:

    通过这些设置,在来宾操作系统上的docker-compose up 之后,我可以列出/创建主题并从主机操作系统使用/生成消息。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2019-08-19
    相关资源
    最近更新 更多