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

时间:2017-05-31 09:44:20

标签: docker apache-kafka

拥有kafka经纪人和动物园管理员的码头图像 - 现在称他们为z1, b1, b2。 它们部署在两个物理服务器s1s2上,如下所示:
s1包含z1b1
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)

交换领导在代理b1b2之间工作,因为它们被关闭并重新启动,但是只有在线的最后一个完全控制主题 - 是所有分区的领导者而且只有一个insync,即使其他经纪人重新上线。

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

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

2 个答案:

答案 0 :(得分:2)

看起来经纪人b1b2无法相互交谈,这表明与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。

最终配置
b1b2 docker-compose.yml使用host网络:

network_mode: "host"

b1 server.properties` - 听众:

listeners=PLAINTEXT://<s1_IP>:9092

b2 server.properties` - 听众:

listeners=PLAINTEXT://<s2_IP>:9092

现在一切正常,复制工作正常,甚至在代理重启时也是如此。 可以正确生成和使用数据。