Docker,Kafka – 复制在远程代理之间不起作用
有卡夫卡经纪人和动物园pipe理员的docker图像 – 现在称之为z1, b1, b2
。 它们被部署在两个物理服务器s1
和s2
如下所示:
s1
包含z1
和b1
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)
在经纪人b1
和b2
之间交换领导力,因为他们被closures并重新开始,但是只有在线的最后一个人完全控制了话题 – 是所有分区的领导者,只有一个insync
,即使其他经纪人重新联机。
试图清理所有数据,重置经纪人和动物园pipe理员,但问题依然存在。
为什么分区没有被正确地复制?
看起来经纪人b1
和b2
不能互相交谈,这表明了Docker相关的networking问题(这种Dockernetworking问题在一般情况下相当普遍)。
您需要共享更多信息以获得进一步的帮助,例如docker-compose.yml
文件的内容以及用于创build映像的Dockerfile
。 我也想知道为什么你为两个经纪人创造了不同的图像,通常你只需要一个卡夫卡经纪人图像,然后简单地从该图像启动多个容器(每个希望的经纪人一个)。
我想到了。 正如Michael G. Noll所说,networking存在问题。
首先,我不再手动映射端口,而是使用host
networking。 这很容易pipe理。
secenodary,b1和b2听众设置如下:
listeners=PLAINTEXT://:9092
他们都没有指定ip,所以默认情况下使用了0.0.0.0
,因为他们都在那里侦听,并且把相同的连接信息推送给zookeeper,所以有了碰撞。
最终configuration :
b1
和b2
docker-compose.yml
使用host
networking:
network_mode: "host"
b1
server.properties` – 听众:
listeners=PLAINTEXT://<s1_IP>:9092
b2
server.properties` – 听众:
listeners=PLAINTEXT://<s2_IP>:9092
一切正常,现在,复制工作,即使在经纪人重新启动。 数据可以正确生成和使用。