几天前,我尝试用docker compose和端口Map配置kafka docker容器,发现了一些有趣的行为,但我并不完全了解:
Kafka经纪人似乎与自己有联系。为什么?
我的设置是:
ubuntu 14.04,docker 1.13.1,docker compose 1.5.2
kafka 0.10监听端口9092,该端口被容器暴露。
在docker compose中,我有从集装箱端口9092到本地端口4005的端口Map。
我从compose in advised.listeners配置了docker主机的主机名和本地端口( docker-host:4005
)因为经纪人应该可以在我的公司网络上看到。
当我尝试向Kafka发送/从Kafka获取数据时,设置了此设置,所有尝试都以以下结果结束: Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}
在尝试了多种端口和主机名组合之后 advertised.listeners
,我发现唯一有效的组合是 localhost:9092
. 任何更改主机名或端口的尝试都会导致上述错误。
这让我觉得Kafka试图连接到中配置的地址 advertised.listeners
这在某种程度上与主题元数据有关。
所以在docker集装箱里我做了:
将流量重定向到“docker主机”以进行环回 echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
将kafka配置为侦听所有接口和端口(与公布的完全相同) sed -r -i "s/#(listeners)=(.*)/\1=PLAINTEXT:\/\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties
播发“docker主机”和外部端口 sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties
现在它就像一个魔咒。
但我还是不明白:
为什么kafka代理可能需要通过中配置的地址连接到自身 advertised.listeners
?
有没有办法禁用或至少配置为使用“侦听器”属性中的地址(使用默认Kafka端口)?
值得一提的是,以下设置不起作用:Kafka监听 0.0.0.0:9092
,播发侦听器配置为 docker-host:4005
.
在这种情况下,只要消费者或生产者连接到Kafka,它就会收到leader\u not\u available。还有netstat(容器内)显示的到docker的连接-host:4005 in 状态syn\ U已发送。
UPD2看起来与Kafka有类似的问题,但在这里描述的aws内部。
不同的是,在我的情况下,我想使用不同的Kafka端口。
UPD3好的,第一段upd中提到的安装程序不起作用的原因是-ufw,由于某些原因它阻止了从docker容器通过主机到自身的通信。
1条答案
按热度按时间laik7k3q1#
为什么kafka代理可能需要通过advised.listeners中配置的地址连接到自身?
当客户机第一次连接到kafka代理时,它会用它希望该客户机将来用来与代理对话的地址进行回复。这是在advised.listeners属性中设置的内容。如果不设置此属性,则将使用侦听器的值(这回答了第二个问题)。
所以你的“问题”是,远程客户端连接到yourhost:9092,到达kafka代理,因为您转发了端口,代理会以“youcan reach me at”响应localhost:9092“当客户端发送下一个数据包到那里时,它只会连接回自己。元数据在这里并不是真正相关的,它只是发出的第一个请求。我认为,您的解决方案对于这种设置是正确的,让kafka监听本地接口,并将advised.listeners设置为您公司网络中的某个人将连接到的主机。我不100%知道经纪人是否也需要连接到自己,但我很确定事实并非如此。我认为在/etc/hosts文件中不输入外部主机名的情况下,您的设置也可以工作。
有没有办法禁用或至少配置为使用“侦听器”属性中的地址(使用默认Kafka端口)?
见上文