fabric部署kafka集群后创建通道无法连接处理过程记录

fabric框架繁杂的部署过程,会出现各种意料之外的错误,由于错误提示不明确,往往很简单的一个疏忽都会浪费大量的时间去找出问题。特此记录一下浪费了两天时间的处理过程。
为了在生产环境使用区块链,需要改造之前基于solo共识机制部署的fabric框架,参考该博主(HyperLedger Fabric 1.4 kafka生产环境部署)的方法将solo共识改为kafka集群。过程一切都顺风顺水,不过将其中的三个zookeeper改成了两个(后来才发现zookeeper集群数量有问题),在一切都安装好之后开始在peer节点上创建通道,此时报错一下错误:

Error: failed to create deliver client: orderer client failed to connect to orderer0.example.com:7050: failed to create new connection: connection error: desc = "transport: error while dialing: dial tcp 192.168.0.204:7050: connect: connection refused"

乍一看还以为是网络问题,于是逐一测试网络连接一切正常。此时开始了骂骂咧咧中一个一个的重新一遍,还是同样的问题,于是在网上重新找了一篇部署的文档开始比对看看有什么不一样的地方,于是发现了zookeeper集群数量的问题。

Zookeeper 集群的数量可以是 3, 5, 7, 它值需要是一个奇数以避免脑裂问题(split-brain)的情况。同时选择大于1的值是为了避免单点故障,如果集群的数量超过7个Zookeeper服务将会无法承受。

重新添加zookeeper2、kafka2、orderer2节点后重启所有服务,问题照旧。看来不是这里的问题,不过无意中解决了重要的问题,下一步开始逐一测试服务是否启动,使用telnet测试orderer节点发现无法连接。

$telnet 192.168.0.204 7050
Trying 192.168.0.204...
telnet: Unable to connect to remote host: Connection refused

于是查看orderer日志,报错,网上也找不到同样的错误,又开始骂骂咧咧。

$docker logs -f orderer1.example.com
...
2021-10-13 09:25:49.862 UTC [orderer.consensus.kafka] startThread -> PANI 010 [channel: testchainid] Cannot post CONNECT message = circuit breaker is open
panic: [channel: testchainid] Cannot post CONNECT message = circuit breaker is open

最后翻了翻zookeeper日志,发现这个broken问什么互相访问不到,打开docker-compose-zookeeper.yaml茅塞顿开。

$docker logs -f zookeeper0
...
2021-10-14 03:15:40,410 [myid:1] - WARN  [RecvWorker:2:QuorumCnxManager$RecvWorker@1025] - Connection broken for id 2, my id = 1, error = 
java.io.EOFException

原来是环境变量里面的ZOO_MY_ID问题,部署第三台zookeeper的时候是从前面复制过来的,这个ID没改到。于是修改docker-compose-zookeeper.yaml、docker-compose-kafka.yaml两个文件的对应内容,重启,问题解决。
一个困扰了我两天的问题原来就是这个小小的疏忽造成的,幸好在我骂骂咧咧不断尝试的过程中及时发现了问题,哎…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 可以很容易地部署 Kafka 集群。下面是一个大致的步骤: 1. 创建一个 Kafka 镜像并将其上传到 Docker Hub 上。Kafka 可以从 Apache Kafka 官网下载并编译。你可以使用 Dockerfile 将其打包成 Docker 镜像。 2. 在 Kubernetes 上安装 ZooKeeper 集群Kafka 需要 ZooKeeper 来管理其 Brokers。 3. 创建一个 Kafka StatefulSet,它会自动创建多个 Kafka 实例。 4. 在 Kubernetes 上创建一个 Kafka Service,它会将流量路由到 StatefulSet 中的 Kafka 实例上。 下面是一个 YAML 文件示例,用于创建一个 Kafka StatefulSet 和 Service: ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka spec: serviceName: kafka replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: your-kafka-image env: - name: KAFKA_ZOOKEEPER_CONNECT value: "zookeeper:2181" - name: KAFKA_ADVERTISED_LISTENERS value: "PLAINTEXT://$(hostname -f):9092" ports: - containerPort: 9092 volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi --- apiVersion: v1 kind: Service metadata: name: kafka spec: type: NodePort selector: app: kafka ports: - name: kafka port: 9092 targetPort: 9092 ``` 这个 YAML 文件会创建一个名为 kafka 的 StatefulSet。它会自动创建 3 个 Kafka 实例,并且使用一个名为 data 的 PVC 来存储数据。它还会创建一个名为 kafka 的 Service,它会将流量路由到 Kafka 实例上,这个 Service 的类型是 NodePort,意味着它会将 Kafka 的端口映射到 Kubernetes 集群中的任何节点上。 你可以使用 `kubectl apply -f kafka.yaml` 命令来应用这个 YAML 文件并创建 Kafka 集群

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值