networking - 从我的局域网外部访问 Kafka 代理
问题描述
我使用下面的默认命令启动了一个普通的 Zookeeper/Kafka 代理,因为这些在一台机器上的Kafka 文档中有所描述(我们称之为Machine A)
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
这些在机器 A 的 localhost:9092 处启动一个代理。
然后我转到同一网络上的另一台计算机(我们将其命名为Machine B),并通过调用它来创建 Kafka 提供的默认使用者
bin/kafka-console-consumer.sh --bootstrap-server IP_ADDRESS_HERE:9092 --topic test --from-beginning
其中 IP_ADDRESS_HERE 是托管代理的机器 A 的本地网络中的 IP 地址(例如,192.168.1.10)
一切正常。然后我尝试从本地网络之外的机器(我们称之为Machine C)访问代理。我转到我的路由器配置,并为托管代理的机器(机器 A)进行端口转发。例如,我执行以下操作
192.168.1.10:9092 --> 9094
这意味着我将 192.168.1.10 设备(机器 A)的内部 9092 端口转发到路由器的端口 9094。然后,我访问YouGetSignal之类的服务并检查我的公共IP 地址(例如,97.190.92.128)的端口 9094 是否打开。我收到一条消息,表明端口确实是打开的。
当我尝试使用以下命令从机器 C 消耗机器 A 中的 borker 时
bin/kafka-console-consumer.sh --bootstrap-server PUBLIC_IP_ADDRESS_HERE:9094 --topic test --from-beginning
其中 PUBLIC_IP_ADDRESS_HERE 是机器 A 所在网络的公共 IP 地址(例如,97.190.92.128)。但是,我收到无法连接到 192.168.1.10:9092 的错误 - 代理可能不可用(请注意,错误中返回了内部 IP:端口,这意味着我的路由器正确提供了信息)
我究竟做错了什么?
解决方案
您需要更新advertised.listeners
您server.properties
的主机/IP 和端口组合,您的客户端可以解析和连接到该组合。
正如您所观察到的,代理192.168.1.10:9092
在响应连接到它的客户端时发出响应,这对于同一网络上的任何机器(包括机器 B)都可以正常工作。
对于机器 C,代理需要告诉它如何连接到代理,如果我正确地遵循了它是PUBLIC_IP_ADDRESS_HERE:9094
.
如果您需要从 LAN 和 WAN 进行连接,则需要两个侦听器;一个用于 LAN,一个用于 WAN。投入server.properties
:
listeners=LISTENER_LAN://0.0.0.0:9092,LISTENER_WAN://0.0.0.0:9094
advertised.listeners=LISTENER_LAN://192.168.1.10:9092,LISTENER_WAN://PUBLIC_IP_ADDRESS_HERE:9094
listener.security.protocol.map: LISTENER_LAN:PLAINTEXT,LISTENER_WAN:PLAINTEXT
inter.broker.listener.name=LISTENER_LAN
请注意,您需要更改端口转发,以便代理上的端点是为LISTENER_WAN
(9094) 定义的端口。如果 WAN 连接尝试连接到 9092 上的代理,则会向其提供LISTEN_LAN
详细信息(这是目前正在发生的事情,并且不起作用)。
推荐阅读
- database - 当应用程序在发送查询以更新记录后立即断开连接时会发生什么?
- julia - 在 Julia 中获取子数组的索引
- typescript - 如何抽象 Typescript 中的类型交集?
- c++ - 二进制搜索不适用于特定输出
- sql - 如何根据特定条件生成行号?
- java - 我正在尝试通过 mysql 数据库在 jdbc 中使用 GUI 插入值,这给了我以下异常:
- python - 为什么 python dict 对象解开元组的一个单独元素,但如果这是一个列表对象,它将它保存在容器中?
- python - 如何让一只乌龟并排跟随另一只?
- python - 考虑到每支球队的概率不同,从 12 支球队中选择 6 支球队进入季后赛
- django - 如何擦除以前设置的一次性默认值