【问题标题】:Kafka Brokers for Hyperledger Fabric could not establish a connectionHyperledger Fabric 的 Kafka Brokers 无法建立连接
【发布时间】:2018-10-21 09:15:59
【问题描述】:

我需要一些帮助来为我的超级账本结构配置我的 kafka 代理 docker 容器。我的设置将是一个由 4 个代理组成的集群,当我引入第二个代理时我遇到了问题。所有经纪人目前都坐在一台机器上,我需要他们公布他们的外部地址,以便我在不同机器上的订购者可以发现他们。

我的 compose 文件包含 1 个 Zookeeper 和 1 个 Broker:

version: '2'

services:
  zookeeper0.hyperfabric.xyz:
    image: hyperledger/fabric-zookeeper
    restart: always
    container_name: zookeeper0.hyperfabric.xyz
    environment:
      - ZOO_SERVERS=server.1=zookeeper0.hyperfabric.xyz:2888:3888
      - ZOO_MY_ID=1
    ports:
      - 2181:2181
      - 2888:2888
      - 3888:3888

  kafka0.hyperfabric.xyz:
    image: hyperledger/fabric-kafka
    restart: always
    container_name: kafka0.hyperfabric.xyz
    environment:
      - KAFKA_MESSAGE_MAX_BYTES=103809024
      - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024
      - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
      - KAFKA_MIN_INSYNC_REPLICAS=1
      - KAFKA_DEFAULT_REPLICATION_FACTOR=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper0.hyperfabric.xyz:2181
      - KAFKA_BROKER_ID=0
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka0.hyperfabric.xyz:9092
    ports:
      - 9092:9092
      - 9093:9093

运行它工作正常。

当我介绍另一个经纪人时使用:

kafka1.hyperfabric.xyz:
  image: hyperledger/fabric-kafka
  restart: always
  container_name: kafka1.hyperfabric.xyz
  environment:
    - KAFKA_MESSAGE_MAX_BYTES=103809024
    - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024
    - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
    - KAFKA_MIN_INSYNC_REPLICAS=1
    - KAFKA_DEFAULT_REPLICATION_FACTOR=1
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper0.hyperfabric.xyz:2181
    - KAFKA_BROKER_ID=1
    - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka1.hyperfabric.xyz:10092
  ports:
    - 10092:9092
    - 10093:9093

我得到以下无限循环错误:

[2018-05-11 02:04:08,310] WARN [Controller id=0, targetBrokerId=1] Connection to node 1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

该错误与我的 KAFKA_ADVERTISED_LISTENERS 环境变量有些相关(KAFKA_ADVERTISED_HOST_NAME 和 KAFKA_ADVERTISED_PORT 也会发生同样的情况)环境变量。如果我删除它,它可以工作,但是我的订购者将不会收到经纪人地址,我将失去订购者和经纪人之间的通信。

我如何维护经纪人之间的内部连接以及与我的订购者的外部连接?

【问题讨论】:

  • 您在同一台主机上运行两个代理?你最好为你的数据使用不同的磁盘......另外,你的外部客户是kafka0:9092,kafka1:10092
  • 同一主机上的两个代理只是暂时的,因为我不想启动更多的 AWS EC2 机器。我不确定你的第二个问题是什么意思,但我的订购者将在他们的创世区块中的地址 kafka0.hyperfabric.xyz:9092 和 kafka1.hyperfabric.xyz:10092 上寻找这些经纪人。
  • 我不知道 orderers 或 genesis block 是什么意思。但是引导服务器需要使用两个端口连接到代理
  • 是的,我相信这种情况正在发生,因为我的订购者(客户)实际上最初是使用指定给他们的地址(通过创世块)访问集群并创建一个主题,然后将其分区并复制。问题似乎在那之后出现。然后我的订购者尝试与代理建立一个新连接(可能作为消费者?),这个新连接最初指向 127.0.0.11:53,这听起来像是一个内部 docker 地址,但由于它们不在同一个地址上,所以失败了机器。这就是我添加 KAFKA_ADVERTISED_LISTENERS 环境的原因。

标签: docker apache-kafka hyperledger-fabric hyperledger


【解决方案1】:

在容器内是配置监听器变量的地方。 10092 是 您的主机 上的端口,而不是容器上的端口。

因此,你想要这个

PLAINTEXT://kafka1.hyperfabric.xyz:9092

随着

ports:
    - 10092:9092

或将10092 用于侦听器端口(加上KAFKA_ADVERTISED_PORT


或者,如果您在 unix 主机上,您可以使用network_mode: host 模式,丢失端口转发,然后您可以use different ports 用于广告侦听器。

【讨论】:

  • 这使我的经纪人能够在没有连接到节点错误的情况下进行通信,但现在我的订购者(客户)只在一半时间内保持连接。即端口 9092 上的 kafka0 有 50% 的机会是领导者。其他时候我得到的主题不存在。我还测试了不使用您的设置启动 kafka0 并且仅启动 kafka1 并且我的订购者吐出 13.236.69.14:9092: getsockopt: connection denied 错误,因为 kafka0 是该端口上的一个,但现在未激活。这是否意味着所做的一切都是将所有内容重定向到 kafka0?
  • 您关于主机上的端口而不是容器的观点引导我走上正确的道路。在修复了第二个容器使用与第一个容器相同的端口的错误后,我能够使用 network_mode: host 让它工作。我强制使用 - KAFKA_PORT=10092。然后我回去并使用解决它的方法再次改变了我的容器。我认为这个问题可能不会发生在不同机器上的经纪人的真实场景中。
【解决方案2】:

我可以通过将我的 kafka1 容器更改为如下所示来连接所有内容:

kafka1.hyperfabric.xyz:
  image: hyperledger/fabric-kafka
  restart: always
  container_name: kafka1.hyperfabric.xyz
  environment:
    - KAFKA_PORT=10092
    - KAFKA_MESSAGE_MAX_BYTES=103809024
    - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024
    - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
    - KAFKA_MIN_INSYNC_REPLICAS=1
    - KAFKA_DEFAULT_REPLICATION_FACTOR=1
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper0.hyperfabric.xyz:2181
    - KAFKA_BROKER_ID=1
    - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka1.hyperfabric.xyz:10092
  ports:
    - 10092:10092
    - 10093:9093

- KAFKA_PORT=10092- 10092:10092 的区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-09-15
    • 2022-12-15
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多