为什么Kafka经纪人会自己连接?

时间:2017-02-23 16:37:32

标签: docker apache-kafka docker-compose

几天前,我尝试使用Docker Compose和端口映射配置Kafka Docker容器,并发现一些我不太了解的有趣行为:

  

Kafka经纪人似乎与自己联系。为什么?

我的设置是:

  • Ubuntu 14.04,Docker 1.13.1,Docker-Compose 1.5.2
  • Kafka 0.10侦听端口9092,此端口由容器公开。
  • 在Docker Compose中,我有从容器端口9092到本地端口4005的端口映射。
  • 我在advertised.listeners(docker-host:4005)中配置了我的Docker主机和本地端口的主机名,因为我的公司网络应该可以看到代理。

当我尝试向/从Kafka发送/获取数据时设置此设置,所有尝试最终都会:

Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}

advertised.listeners中尝试各种端口和主机名组合后,我发现唯一的工作组合是localhost:9092。任何更改主机名或端口的尝试都会导致上述错误 这让我觉得Kafka尝试连接到advertised.listeners中配置的地址,这与主题元数据有某种关系。

所以我在Docker容器中做了:

  • 将流量重定向到“docker-host”以进行环回 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-host”和外部端口
    sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties

现在它就像一个魅力。

但我还是不明白:

  1. 为什么Kafka经纪人可能需要通过advertised.listeners
  2. 中配置的地址连接自己
  3. 有没有办法禁用它或者至少将其配置为使用'listeners'属性中的地址(使用默认的Kafka端口)?
  4. UPD 值得一提的是,以下设置不起作用:Kafka监听0.0.0.0:9092,广告监听器配置为docker-host:4005
    在这种情况下,只要消费者或生产者连接到kafka,它就会收到LEADER_NOT_AVAILABLE。 netstat(在容器内)还显示连接到docker-host:4005处于状态SYN_SENT。

    UPD 2 看起来像Kafka有类似的问题,但在AWS内部描述了here 不同的是,在我的情况下,我想使用不同的Kafka端口。

    UPD 3 好吧,第一个 UPD 段落中提到的设置不起作用的原因是 - UFW,由于某些原因它阻止了通过主机从docker容器到自身的流量。

0 个答案:

没有答案