在 VirtualBox 中连接到 Kafka

Connect to Kafka inside VirtualBox

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

我已经设置了一个 VM(使用 VirtualBox),我在其中安装了 Confluent 工具。在这个 VM 中,我 运行 命令:

confluent start schema-registry

它启动 zookeeper、kafka 和 schema-registry。

在这个虚拟机下,我可以运行

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 

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

这似乎是来宾和主机之间的主机名差距。 Linux 访客的主机名是什么?

当producer/consumer访问Kafka broker时,Kafka broker returns默认设置为数据生产者或消费者的主机名。因此 producers/consumers 需要将代理的主机名解析为 IP 地址。

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

详情在the "advertised.listeners" configuration docs.

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

我有一些东西可以在 VirtualBox Linux 来宾本身上与 Kafka 和 Zookeeper 运行 一起工作,以及一个基于 docker 的解决方案 运行那个 Linux 客人。这是我在 guest 中使用的 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 HostOS 上的任何消费者或生产者都将从 Kafka 了解到它位于 "localhost",解析为 Host,但因为主机上的端口已修补到 guest 上,所以一切都在正确的位置。

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


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

使用这些设置,在访客 OS 上 docker-compose up 之后,我可以 list/create 主题和来自主机 OS 的 consume/produce 消息。