我的Kafka节点托管在Google Cloud Dataproc中。但是,我们意识到通过默认初始化脚本安装的Kafka的设置方式仅允许内部网访问。它与外界完全隔离。谷歌云网络外部的生产者无法将消息发布到Kafka,Kafka消息也不能链接到其Extranet订户。
备注
我已将生产者IP列入白名单
通过其他StackOverflow,博客文章和文档阅读后。我认为可能是由于advertised.listeners
中Socket Server Settings
的/usr/lib/kafka/server.properties
部分。
第一个解决方案
我添加了
advertised.listeners=PLAINTEXT://[External_IP]:19092
然后
sudo /etc/init.d/kafka-server restart
结果
但是,当我尝试使用Kafkacat或telnet时,它总是失败。我还用各种端口测试了advertised.listeners
第二解决方案来自https://rmoff.net/2018/08/02/kafka-listeners-explained/
############################# Server Basics #############################
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=0
############################# Socket Server Settings #############################
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = listener_name://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
#
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
->>>>>>> I added below listener config according to https://rmoff.net/2018/08/02/kafka-listeners-explained/
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:19092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=EXTERNAL://[External_IP]:19092,INTERNAL://[Internal_IP]:9092
inter.broker.listener.name=INTERNAL
结果
与上面的结果相同,不起作用。
防火墙规则
有人可以帮我解决这个问题吗?
这是适用于我的集群的内容:
我从第二个解决方案中设置了以下属性:
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:19092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=EXTERNAL://[External_IP]:19092,INTERNAL://[Internal_IP]:9092
inter.broker.listener.name=INTERNAL
我创建了一个防火墙规则,将端口19092打开到我的个人开发计算机IP,并将其应用于网络。 从我的机器上,我尝试通过telnet接入kafka服务器,并且得到了:
$ telnet [EXTERNAL-IP] 19092
Trying [EXTERNAL-IP]...
Connected to [EXTERNAL-IP].
Escape character is '^]'.
然后我尝试使用kafkacat,但出现错误。在调试中运行,我看到错误是因为我没有设置任何主题:
%7|1578351264.551|METADATA|rdkafka#producer-1| [thrd:main]: [EXTERNAL-IP]:19092/bootstrap: ===== Received metadata: application requested =====
%7|1578351264.551|METADATA|rdkafka#producer-1| [thrd:main]: [EXTERNAL-IP]:19092/bootstrap: ClusterId: jYxfi6zzR0euAovYyKCFZg, ControllerId: -1
%7|1578351264.551|METADATA|rdkafka#producer-1| [thrd:main]: [EXTERNAL-IP]:19092/bootstrap: 0 brokers, 0 topics
%7|1578351264.551|METADATA|rdkafka#producer-1| [thrd:main]: [EXTERNAL-IP]:19092/bootstrap: No brokers or topics in metadata: should retry
%7|1578351264.551|REQERR|rdkafka#producer-1| [thrd:main]: [EXTERNAL-IP]:19092/bootstrap: MetadataRequest failed: Local: Partial response: explicit actions Retry
%7|1578351264.551|RETRY|rdkafka#producer-1| [thrd:[EXTERNAL-IP]:19092/bootstrap]: [EXTERNAL-IP]:19092/bootstrap: Retrying MetadataRequest (v2, 25 bytes, retry 1/2, prev CorrId 3) in 100ms
[请注意,我尝试从外部连接到集群的kafka服务器。在问题中,telnet和kafkacat与kafka服务器(kafka-tng-w-0)在同一台计算机上运行。