【问题标题】:Docker, Kafka - replication doesn't work between remote brokersDocker,Kafka - 远程代理之间的复制不起作用
【发布时间】:2017-11-01 01:15:10
【问题描述】:

拥有 kafka 代理和 zookeeper 的 docker 图像 - 暂时将其称为 z1, b1, b2。 它们部署在两个物理服务器 s1 和 s2 上,如下所示:
s1 包含 z1 和 b1
s2 包含 b2

zookeeper在自己的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 会从insync 中删除b2 分区副本,但@987654339 @ 不会从 insync 中删除 b1 分区副本。

在来自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 ,即使其他代理重新联机。

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

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

【问题讨论】:

    标签: docker apache-kafka


    【解决方案1】:

    代理 b1 和 b2 似乎无法相互通信,这表明存在与 Docker 相关的网络问题(这种 Docker 网络问题通常很常见)。

    您需要分享更多信息以获得更多帮助,例如docker-compose.yml 文件的内容以及例如用于创建图像的Dockerfile。我还想知道为什么您为两个代理创建了不同的映像,通常您只需要一个 Kafka 代理映像,然后简单地从该映像启动多个容器(每个所需的代理一个)。

    【讨论】:

    • 感谢您的回复。我不能在这里粘贴 docker 文件;这将毫无意义,因为现在只有网络设置很重要。 docker-compose.yml 中的端口如前所述进行映射,zookeepers 客户端端口设置为 2181;并且两个 kafka 经纪人都有 listeners=PLAINTEXT://127.0.0.1:9092。我还尝试不指定 ip 并更改端口,以便将代理映射到 0.0.0.0:9092 和 0.0.0.0:9093,但问题仍然存在。另请阅读有关 REPLICATION 侦听器的信息 - 是否应该设置为我只指定了 PLAINTEXT?
    • 你的环境是什么?你运行这个吗?在 Mac 上本地还是在 Kubernetes 内部?您是在使用带有 Linux VM 的 docker-machine,还是...?这会影响 Docker 的网络功能。此外,显示 docker 文件并非毫无意义,因为您一直在询问有关 Docker 设置的问题,而且当您看不到全貌时,很难帮助您进行调试——例如主机网络模式还是桥接网络模式?如何设置容器的hostname?
    【解决方案2】:

    我想通了。正如 Michael G. Noll 所说,网络存在问题。
    首先,我不再手动映射端口,而是使用host 网络。它更易于管理。
    Secenodary,b1 和 b2 的监听器设置如下:

    listeners=PLAINTEXT://:9092
    

    他们都没有指定 ip,所以默认使用 0.0.0.0 并且存在冲突,因为他们都在那里监听并将相同的连接信息推送到 zookeeper。

    最终配置:
    b1和b2docker-compose.yml使用host网络:

    network_mode: "host"
    

    b1 server.properties` - 监听器:

    listeners=PLAINTEXT://<s1_IP>:9092
    

    b2 server.properties` - 监听器:

    listeners=PLAINTEXT://<s2_IP>:9092
    

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

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2017-10-12
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多