我使用下面的默认命令启动了一个普通的动物园管理员/Kafka代理程序,因为这些命令在一台机器中的Kafka文献中被描述了(让我们称它为机器A)
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties它们在机器A的localhost:9092启动一个代理程序。
然后,我转到另一台计算机(让我们称它为Machine ),它位于同一网络上,并通过调用以下命令创建了卡夫卡提供的默认消费者
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 )。我进入路由器配置,并为驻留代理的机器(机器A)进行端口转发。例如,我执行以下操作
192.168.1.10:9092 --> 9094这意味着我将192.168.1.10设备(机器A)的内部9092端口转发到我的路由器的端口9094。然后,我转到像YouGetSignal这样的服务,检查我的公共 IP地址(例如97.190.92.128)的端口9094是否打开。我收到一个信息,港口确实是开放的。
当我尝试使用机器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:端口,这意味着我的路由器正确地提供了信息)
我做错了什么?
发布于 2020-04-08 13:59:57
您需要更新您的advertised.listeners中的server.properties,以提供一个主机/IP和端口组合,您的客户端可以解析并连接到这个组合。
正如您所观察到的,代理发出192.168.1.10:9092是为了响应连接到它的客户端,这对于同一网络上的任何机器(包括机器B)都会很好地工作。
对于Machine,代理需要告诉它如何连接到代理,如果我正确的话,它就是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)定义的端口。如果一个广域网连接试图在9092上连接到代理,那么它将获得LISTEN_LAN的详细信息(这是目前正在发生的事情,不能工作)。
参考文献:https://rmoff.net/2018/08/02/kafka-listeners-explained/
https://stackoverflow.com/questions/61101236
复制相似问题