拥有kafka经纪人和动物园管理员的码头图像 - 现在称他们为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
个分区副本。
在b1
的server.log中,显示了许多例外情况:
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
,即使其他经纪人重新上线。
尝试清理所有数据,重置经纪人和动物园管理员,但问题仍然存在。
为什么分区没有正确复制?
答案 0 :(得分:2)
看起来经纪人b1
和b2
无法相互交谈,这表明与Docker相关的网络问题(并且此类Docker网络问题在一般情况下非常常见)。
您需要分享更多信息以获得进一步的帮助,例如: docker-compose.yml
文件的内容以及例如Dockerfile
个文件的内容。您用来创建图片的void dropSet(Set s) {
if (s == NULL) {
return;
}
Node next, curr = s->elems;
while (curr != NULL) {
next = curr->next;
dropNode(curr);
curr = next;
}
free(s) // <== Should this line be here or no?
s = NULL; // <== Should this line be here or no?
}
。我也想知道为什么你为这两个经纪人创建了不同的图像,通常你只需要一个Kafka经纪人图像,然后只需从该图像中启动多个容器(每个所需经纪人一个)。
答案 1 :(得分:0)
我明白了。正如Michael G. Noll所说,网络存在问题
首先,我不再手动映射端口,而是使用host
网络。它更容易管理
Secenodary,b1和b2的听众设置如下:
listeners=PLAINTEXT://:9092
他们都没有指定ip,所以默认情况下使用0.0.0.0
并且发生了冲突,因为他们都在那里听取并将相同的连接信息推送到zookeeper。
最终配置:
b1
和b2
docker-compose.yml
使用host
网络:
network_mode: "host"
b1
server.properties` - 听众:
listeners=PLAINTEXT://<s1_IP>:9092
b2
server.properties` - 听众:
listeners=PLAINTEXT://<s2_IP>:9092
现在一切正常,复制工作正常,甚至在代理重启时也是如此。 可以正确生成和使用数据。