[英]Why Kafka broker connects to itself?
几天前,我尝试使用Docker Compose和端口映射配置Kafka Docker容器,并发现有趣的行为,但我并未完全理解:
卡夫卡经纪人似乎与自己建立了联系。 为什么呢
我的设置是:
docker-host:4005
)中通过Compose配置了Docker主机的主机名和本地端口,因为代理应该从我的公司网络中可见。 有了这个设置,当我尝试向Kafka发送数据或从Kafka获取数据时,所有尝试都会以以下形式结束:
Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}
在尝试了advertised.listeners
中端口和主机名的各种组合之后,我发现唯一localhost:9092
组合是localhost:9092
。 尝试更改主机名或端口会导致上述错误。
这使我认为Kafka尝试连接到advertised.listeners
配置的地址,这与主题元数据有关。
所以在Docker容器中我做了:
echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
sed -r -i "s/#(listeners)=(.*)/\\1=PLAINTEXT:\\/\\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties
sed -r -i "s/#(advertised.listeners)=(.*)/\\1=PLAINTEXT:\\/\\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties
现在,它就像一种魅力。
但是我还是不明白:
advertised.listeners
配置的地址连接到自身? UPD值得一提的是,以下设置无效:Kafka侦听0.0.0.0:9092
,播发的侦听器配置为docker-host:4005
。
在这种情况下,只要消费者或生产者连接到kafka,它都会收到LEADER_NOT_AVAILABLE。 netstat(在容器中)还显示了到状态为SYN_SENT的docker-host:4005的连接。
UPD 2看起来Kafka也有类似的问题,但此处描述了 AWS内部。
区别在于我要使用其他Kafka端口。
UPD 3好吧,第一段UPD中提到的设置不起作用的原因是-UFW,由于某些原因,它阻止了从Docker容器通过主机流向自身的流量。
为什么Kafka经纪人可能需要通过advertised.listeners中配置的地址连接到自身?
当Kafka经纪人首次与客户建立联系时,它会用希望该客户将来与经纪人对话的地址进行回复。 这是在advertised.listeners属性中设置的。 如果您未设置此属性,则将改用来自侦听器的值(它将回答您的第二个问题)。
因此,您的“问题”是,远程客户端连接到yourhost:9092,到达Kafka代理,因为您转发了端口,该代理然后响应“您可以在localhost:9092与我联系”,并且当客户端发送下一个数据包时在那里,它只是重新连接到自身。 元数据在这里并不真正相关,它只是第一个发出的请求。 我认为您的解决方案对此设置是正确的,让Kafka侦听本地接口并将advertised.listeners设置为公司网络中某人将连接到的主机。 我不是100%知道经纪人是否也需要连接到自身,但是可以肯定的是事实并非如此。 我认为您的设置也可以在没有在/ etc / hosts文件中输入外部主机名的情况下工作。
有没有办法禁用此功能或至少将其配置为使用“ listeners”属性中的地址(带有默认的Kafka端口)?
往上看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.