为什么卡夫卡经纪人连接到自己?
几天前,我尝试使用Docker Compose和端口映射来configurationKafka Docker容器,并发现我不完全了解的有趣行为:
卡夫卡经纪人似乎连接到自己。 为什么?
我的设置是:
- Ubuntu 14.04,Docker 1.13.1,Docker-Compose 1.5.2
- 卡夫卡0.10在端口9092上监听,这个端口被容器暴露。
- 在Docker Compose中,我有从容器端口9092到本地端口4005的端口映射。
- 我configuration了我的Docker主机的主机名和来自Compose的本地端口在advertised.listeners(
docker-host:4005
),因为代理应该从我的公司networking中可见。
有了这个设置,当我试图发送/从卡夫卡获取数据,所有的尝试结果:
Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}
在advertised.listeners
尝试各种端口和主机名的组合后,我发现唯一的工作组合是localhost:9092
。 任何尝试更改主机名或端口导致上述错误。
这让我觉得,Kafka试图连接到advertised.listeners
configuration的地址,这与主题元数据有某种关系。
所以在Docker容器中我做了:
- 将stream量redirect到“docker-host”进行环回
echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
- configurationKafka监听所有的接口和端口(确切的广告)
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
现在它像一个魅力。
不过我还是不明白:
- 为什么卡夫卡经纪人可能需要通过在
advertised.listeners
configuration的地址连接到自己? - 有没有办法来禁用这个或至lessconfiguration它使用地址从“侦听”属性(使用默认的Kafka端口)?
UPD值得一提的是,以下设置不起作用:Kafka侦听0.0.0.0:9092
,广告监听器configuration为docker-host:4005
。
在这种情况下,只要消费者或生产者连接到卡夫卡,它就会收到LEADER_NOT_AVAILABLE。 还有一个由netstat(容器内)向docker-host:4005以SYN_SENT状态显示的连接。
UPD 2看起来像Kafka有类似的问题,但在这里描述的AWS内部。
不同的是,在我的情况下,我想使用不同的Kafka端口。
UPD 3好吧,为什么在第一个UPD段落提到的设置不起作用的原因是 – UFW,由于某些原因,它阻止从docker集装箱到主机的stream量。
为什么卡夫卡经纪人可能需要通过在advertised.listeners中configuration的地址连接到自己?
当一个卡夫卡经纪人首先被一个客户连接起来时,它回复的地址是它期望客户将来使用的地址与经纪人交谈。 这是在advertised.listeners属性中设置的内容。 如果你不设置这个属性,那么将会使用监听器的值来代替(这将回答你的第二个问题)。
所以你的“问题”是,远程客户端连接到你的主机:9092,到达卡夫卡经纪人,因为你转发的端口,经纪人然后回应“你可以达到我在localhost:9092”,当客户端发送下一个数据包它只是连接回自己。 这里的元数据并不真正相关,它只是第一个被请求的请求。 您的解决scheme对于此设置是正确的,我想,让Kafka监听本地接口,并将advertised.listener设置为您公司networking中的某个人将连接到的主机。 我不是100%知道经纪人是否也需要连接自己,很确定那不是那种情况。 我想你的设置也可以在你的/ etc / hosts文件中没有input外部主机名的情况下工作。
有没有办法来禁用这个或至lessconfiguration它使用地址从“侦听”属性(使用默认的Kafka端口)?
往上看