为什么卡夫卡经纪人连接到自己?

几天前,我尝试使用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.listenersconfiguration的地址,这与主题元数据有某种关系。

所以在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

现在它像一个魅力。

不过我还是不明白:

  1. 为什么卡夫卡经纪人可能需要通过在advertised.listenersconfiguration的地址连接到自己?
  2. 有没有办法来禁用这个或至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端口)?

往上看