连接到virtualbox中的kafka

vngu2lb8  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(311)

我在从主机(windows)连接到安装了kafka的guest(linux)时遇到问题。
我已经建立了一个vm(带有virtualbox),在那里我安装了合流工具。在这个虚拟机中,我运行以下命令:

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

我试过很多不同的方法,但还是找不到解决办法。。。。有什么想法吗?

z2acfund

z2acfund1#

这似乎是客人和主人之间的主机名差距。linux客户机有什么主机名?
当生产者/消费者访问kafka代理时,kafka代理将以默认设置返回其数据生产者或消费者的主机名。所以生产者/消费者需要将代理的主机名解析为ipaddress。
对于返回任意主机名的代理,请使用 advertised.listeners 设置。
详细信息请参见“adverted.listeners”配置文档。

nhaq1z21

nhaq1z212#

我想做点类似的事情。尽管为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的网络配合使用(假设您已经打了补丁) 2181 以及 9092 通过行动)。通过这个技巧,virtualbox主机os上的任何消费者或生产者都将从kafka那里了解到它所在的位置 "localhost" ,它解析为主机,但由于主机上的端口已通过补丁连接到访客,因此最终会出现在正确的位置。
在1.x中执行相同操作的正确方法是使用播发的侦听器属性,但原理保持不变。
以下是我的virtualbox设置供参考:

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

相关问题