2017-05-31 79 views
0

有kafka经纪人和动物园管理员的码头图像 - 现在称其为z1, b1, b2。 他们被部署在两台物理服务器s1s2像这样:
s1包含z1b1
s2包含b2Docker,Kafka - 复制在远程经纪人之间不起作用

在自己的docker-compose.yml文件,动物园管理员已经设置端口如下:

- 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不会insync删除b1分区副本。

在从b1 server.log中,有许多展示这些异常:

WARN [ReplicaFetcherThread-0-1], Error in fetch [email protected] (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

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

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

回答

0

我想通了。正如Michael G. Noll所说,网络存在问题。
首先,我不再手动映射端口,而是使用host网络。这很容易管理。
Secenodary,B1和B2已经建立像这样的听众:

listeners=PLAINTEXT://:9092 

她们都没有指定的IP,所以0.0.0.0使用默认并有collission,因为他们都听了有推相同的连接信息的ZooKeeper 。

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

network_mode: "host" 

b1 server.properties` - 听众:

listeners=PLAINTEXT://<s1_IP>:9092 

b2 server.properties` - 听众:

listeners=PLAINTEXT://<s2_IP>:9092 

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

2

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

您需要分享更多信息才能获得进一步的帮助,例如,文件的(一个或多个)docker-compose.yml的内容以及例如您用来创建图像的Dockerfile。我还想知道为什么您为两个经纪人创建了不同的图像,通常您只需要一张卡夫卡经纪人图像,然后只需从该图像中启动多个容器(每个希望的经纪人一个)。

+0

感谢您的回复。我无法在这里粘贴docker文件;因为现在只有网络设置很重要,所以它毫无意义。 docker-compose.yml中的端口如问题所述映射,zookeepers客户端端口设置为2181;并且两个kafka经纪人都有听众= PLAINTEXT://127.0.0.1:9092。我也试过不指定IP和更改端口,所以经纪人被映射到0.0.0.0:9092和0.0.0.0:9093,但问题仍然存在。还请阅读REPLICATION侦听器 - 是否应该将其设置为我只有PLAINTEXT指定的? – milkamar

+0

你的环境是什么?你运行这个例如本地Mac或Kubernetes内?你在使用docker-machine或者Linux VM吗?或者...?这会影响Docker的网络功能。此外,显示Docker文件并不毫无意义,因为您不断询问有关Docker设置的问题,并且在无法看到完整图片时很难帮助您进行调试 - 例如,主机网络模式还是网桥模式?你如何设置容器的'hostname'? –