在 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
设置。
我正在尝试设置类似的东西。虽然为 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 的网络配合得很好(假设你已经修补了2181
和 9092
通过 OP 所做的)。通过这个技巧,VirtualBox HostOS 上的任何消费者或生产者都将从 Kafka 了解到它位于 "localhost"
,解析为 Host,但因为主机上的端口已修补到 guest 上,所以一切都在正确的位置。
在 1.x 中执行相同操作的正确方法是使用 Advertised Listeners 属性,但原理保持不变。
作为参考,这是我的 VirtualBox 设置:
使用这些设置,在访客 OS 上 docker-compose up
之后,我可以 list/create 主题和来自主机 OS 的 consume/produce 消息。
我在从主机 (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
设置。
我正在尝试设置类似的东西。虽然为 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 的网络配合得很好(假设你已经修补了2181
和 9092
通过 OP 所做的)。通过这个技巧,VirtualBox HostOS 上的任何消费者或生产者都将从 Kafka 了解到它位于 "localhost"
,解析为 Host,但因为主机上的端口已修补到 guest 上,所以一切都在正确的位置。
在 1.x 中执行相同操作的正确方法是使用 Advertised Listeners 属性,但原理保持不变。
作为参考,这是我的 VirtualBox 设置:
使用这些设置,在访客 OS 上 docker-compose up
之后,我可以 list/create 主题和来自主机 OS 的 consume/produce 消息。