Docker,Kafka – 复制在远程代理之间不起作用

有卡夫卡经纪人和动物园pipe理员的docker图像 – 现在称之为z1, b1, b2 。 它们被部署在两个物理服务器s1s2如下所示:
s1包含z1b1
s2包含b2

在他们自己docker-compose.yml文件中,zookeeper设置了以下端口:

 - 2181:2181 - 2888:2888 - 3888:3888 

和经纪人如下:

 - 9092:9092 

可以创build带有--replication-factor 2--partitions 4主题。
没有数据被推送到话题的整个时间,但仍然会出现以下问题。
如果在主题创build后不久运行kafka-topics --describe --topic <name_of_topic> --zookeeper <zookeeperIP:port> ,则全部为insync并且看起来不错。
在第二次运行(短暂延迟)时, b1从其insync删除b2分区副本,但是b2不会从insync删除b1分区副本。

b1 server.log中,显示了许多这样的exception:

 WARN [ReplicaFetcherThread-0-1], Error in fetch kafka.server.ReplicaFetcherThread$FetchRequest@42746de3 (kafka.server.ReplicaFetcherThread) java.io.IOException: Connection to ef447651b07a:9092 (id: 1 rack: null) failed at kafka.utils.NetworkClientBlockingOps$.awaitReady$1(NetworkClientBlockingOps.scala:83) at kafka.utils.NetworkClientBlockingOps$.blockingReady$extension(NetworkClientBlockingOps.scala:93) at kafka.server.ReplicaFetcherThread.sendRequest(ReplicaFetcherThread.scala:248) at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:238) at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:42) at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:118) at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:103) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63) 

在经纪人b1b2之间交换领导力,因为他们被closures并重新开始,但是只有在线的最后一个人完全控制了话题 – 是所有分区的领导者,只有一个insync ,即使其他经纪人重新联机。

试图清理所有数据,重置经纪人和动物园pipe理员,但问题依然存在。

为什么分区没有被正确地复制?

看起来经纪人b1b2不能互相交谈,这表明了Docker相关的networking问题(这种Dockernetworking问题在一般情况下相当普遍)。

您需要共享更多信息以获得进一步的帮助,例如docker-compose.yml文件的内容以及用于创build映像的Dockerfile 。 我也想知道为什么你为两个经纪人创造了不同的图像,通常你只需要一个卡夫卡经纪人图像,然后简单地从该图像启动多个容器(每个希望的经纪人一个)。

我想到了。 正如Michael G. Noll所说,networking存在问题。
首先,我不再手动映射端口,而是使用hostnetworking。 这很容易pipe理。
secenodary,b1和b2听众设置如下:

 listeners=PLAINTEXT://:9092 

他们都没有指定ip,所以默认情况下使用了0.0.0.0 ,因为他们都在那里侦听,并且把相同的连接信息推送给zookeeper,所以有了碰撞。

最终configuration
b1b2 docker-compose.yml使用hostnetworking:

 network_mode: "host" 

b1 server.properties` – 听众:

 listeners=PLAINTEXT://<s1_IP>:9092 

b2 server.properties` – 听众:

 listeners=PLAINTEXT://<s2_IP>:9092 

一切正常,现在,复制工作,即使在经纪人重新启动。 数据可以正确生成和使用。