有Kafka经纪人和Zookeeper的docker图片-打电话给他们 z1, b1, b2
现在。它们部署在两个物理服务器上 s1
以及 s2
因此: s1
包含 z1
以及
b1 s2
包含 b2
以他们自己的方式 docker-compose.yml
文件中,zookeeper设置了如下端口:
- 2181:2181
- 2888:2888
- 3888:3888
经纪人如下:
- 9092:9092
主题 --replication-factor 2
以及 --partitions 4
可以创建。
在整个时间内没有数据被推送到主题,但仍然发生以下问题。
如果 kafka-topics --describe --topic <name_of_topic> --zookeeper <zookeeperIP:port>
在主题创建后不久运行 insync
看起来不错。
第二次运行时(短延迟), b1
删除 b2
从它的 insync
,但是 b2
不删除 b1
从分区副本 insync
.
在server.log中 b1
,有许多例外情况:
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
,因为它们被关闭并再次启动,但是只有最后一个联机的分区完全控制主题—是所有分区的领导者,并且只有一个分区 insync
,即使另一个经纪人重新上线。
尝试清理所有数据,重置代理和zookeeper,但问题仍然存在。
为什么分区没有正确复制?
2条答案
按热度按时间cunj1qz11#
看起来像是经纪人
b1
以及b2
不能相互交谈,这表明存在与docker相关的网络问题(此类docker网络问题通常很常见)。您需要共享更多信息以获得进一步帮助,例如
docker-compose.yml
文件以及Dockerfile
你用它来创建你的图像。我还想知道为什么您为两个代理创建了不同的映像,通常您只需要一个kafka代理映像,然后只需从该映像启动多个容器(每个所需的代理一个)。cuxqih212#
我想出来了。网络出现了问题,正如michael g。诺尔说。
首先,我不再手动Map端口并使用
host
而不是网络。更容易管理。其次,b1和b2的侦听器设置如下:
它们都没有指定ip,所以
0.0.0.0
默认情况下使用了,并且发生了碰撞,因为他们都在那里侦听,并将相同的连接信息推送到zookeeper。最终配置:
b1
以及b2
docker-compose.yml
使用host
网络:listeners=PLAINTEXT://<s1_IP>:9092
```
b2
server.properties`-侦听器:现在一切正常,复制工作正常,甚至在代理重新启动时也是如此。可以正确地生成和使用数据。