Hyperledger Fabric 1.4 Kafka分布式环境搭建

  • 陈俊飞
  • 更新于 2020-09-22 13:53
  • 阅读 3938

Hyperledger Fabric 是一个开源的企业级许可分布式分类帐技术(DLT)平台,专为在企业环境中使用而设计。

Hyperledger Fabric 是一个开源的企业级许可分布式分类帐技术(DLT)平台,专为在企业环境中使用而设计。有基础的同学应该都对 Hyperledger Fabric 共识机制有一点了解,Fabric 共识机制分为 Solo、Kafka。

Solo 模式存在单点故障问题,容易导致网络瘫痪,不适用于生产;因此生产推荐使用 Kafka。Kafka 依赖 ZooKeeper,可以容忍部分节点失效。本 Chat 将基于 Kafka 共识实现排序节点的分布式网络搭建,采用图文的方式让读者更加容易理解。

主要内容有:

  • Fabric 基础环境搭建(Docker、Docker Compose、Go);
  • Fabric 证书文件配置及工具的使用,通道配置及使用;
  • Fabric 基于 Kafka 共识的分布式网络搭建(含 CA、CouchDB);
  • Fabric 通道创建、加入,链码的安装、实例化、交易测试等。

本次环境搭建将基于 3 个 ZooKeeper 服务、4 个 Kafka 服务、3 个排序节点服务、2 个组织,每个组织一个 CA 服务、3 个节点,组织 1 两个节点,组织 2 一个节点,每个节点对应一个 CouchDB,总共 4 台服务器进行配置。网络节点规划如下:

192.168.100.100:zookeeper0、kafka0、orderer0
192.168.100.101:zookeeper1、kafka1、orderer1、peer0.org1、ca0、couchdb0
192.168.100.102:zookeeper2、kafka2、orderer2、peer1.org1、couchdb1
192.168.100.102:kafka3、peer0.org2、ca1、couchdb2

前提

  • 服务器:CentOS 7
  • 服务器之间网络是通的
  • 每台服务器 /etc/hosts 文件新增 order 节点及其他节点的 IP 映射

enter image description here

  • 防火墙是关闭的,不然会遇到服务启动,但访问不了的情况。
  • 查看防火墙状态:firewall-cmd --state
  • 关闭防火墙:systemctl stop firewalld.service
  • 禁止开机启动:systemctl disable firewalld.service

基础环境搭建

备注:4 台机器都要进行基础环境的搭建。

1. Docker 安装

1) 使用 root 权限登录 CentOS。确保 yum 包更新到最新。执行命令:

yum update

2) 卸载旧版本(如果安装过旧版本的话):

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

3) 安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 Device Mapper 驱动依赖的。

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

4) 设置 yum 源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

5) 安装最新版本 Docker:

yum install docker-ce

6) 设置开机自启动:

systemctl start docker
systemctl enable docker

7) 验证安装:

docker version

enter image description here

2. docker-compose 安装

1) 安装:

curl -L “https://github.com/docker/compose/releases/download/1.22.0/docker-compose-(uname -s)-(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose

2) 添加 docker-compose 可执行权限:

chmod +x /usr/local/bin/docker-compose

3) 验证安装:

docker-compose version

enter image description here

3. Go 安装

1) 获取 Go 安装包:

wget -c https://storage.googleapis.com/golang/go1.11.1.linux-amd64.tar.gz

2) 解压:

tar -C /usr/local/ -zxvf go1.11.1.linux-amd64.tar.gz

3) 编辑环境变量:

vi /etc/profile

新增:

export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=/root/go/

enter image description here

4) 配置立即生效:

source /etc/profile

5) 验证:

go version

enter image description here

4. 镜像及二进制文件下载,参考官网提供的方式

在 GOPATH 下面新建目录 src/github.com/hyperledger,进到该目录执行:

wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh

获取 bootstrap.sh 执行文件(如果没有 wget 命令可以使用 yum install wget 安装),该文件包含 fabric-samples、镜像、二进制文件的下载。

给 bootstrap.sh 添加可执行权限:

chmod +x bootstrap.sh

执行 bootstrap.sh:./bootstrap.sh 即可下载 fabric-samples、镜像、二进制文件。

enter image description here

二进制文件默认下载到 fabric-samples 下面的 bin 目录:

enter image description here

建议可以将其加入到 PATH 环境变量中,这样可以在任意位置执行这些命令,编辑 /etc/profile,新增以下配置,保存退出后执行 source /etc/profile 使配置生效。

export PATH=$PATH:/root/go/src/github.com/hyperledger/fabric-samples/bin

使用 docker images 命令查看已经下载的镜像。

enter image description here

Kafka 分布式网络搭建部署

因编辑器原因,我将 Kafka 集群部署涉及的所有文件单独放到 这篇文章中。

步骤一:编写 crypto-config.yaml 和 configtx.yaml 配置文件,分别用于生成证书和通道配置信息

在 192.168.100.100 服务器上操作

cd $GOPATH/src/github.com/hyperledger/fabric-samples

创建目录

mkdir kafka_cluster

后续操作都在该目录下。

新增 crypto-config.yaml 文件:

https://blog.csdn.net/u010857052/article/details/90215027

新增 configtx.yaml 文件:

https://blog.csdn.net/u010857052/article/details/90215027

步骤二:根据上述编辑的文件生成证书和通道配置信息

1) 生成证书跟私钥文件

cryptogen generate --config=./crypto-config.yaml

查看目录结构

enter image description here

2) 生成创世区块及通道配置区块

创建目录:mkdir channel-artifacts

使用 configtxgen 生成创世区块:

configtxgen -channelID kafka-channel -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

其中

  • channelID:channel 名称,如果不指定默认是 testchainid
  • profile:配置文件中的节点,用于生成相关配置文件
  • outputBlock:输出区块文件路径

3) 使用 configtxgen 生成创世区块

configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

其中

  • profile:配置文件中的节点,用于生成相关配置文件
  • outputCreateChannelTx:指定生成 channel 配置文件的路径
  • channelID:channel 名称

enter image description here

4) 将目录下的所有文件全部拷贝到其他服务器同级目录备用

scp 命令格式:

scp [参数] [原路径] [目标路径]
scp -r ./ root@192.168.100.101:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster
scp -r ./ root@192.168.100.102:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster
scp -r ./ root@192.168.100.103:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster

步骤三:编写各个服务器的配置文件

  • 192.168.100.100 服务器配置 docker-compose-up.yaml
  • 192.168.100.101 服务器配置 docker-compose-up.yaml
  • 192.168.100.102 服务器配置 docker-compose-up.yaml
  • 192.168.100.103 服务器配置 docker-compose-up.yaml

详细代码见

https://blog.csdn.net/u010857052/article/details/90215027

步骤四:启动所有节点服务

1) 分别在 4 个服务器启动所有服务:

docker-compose -f docker-compose-up.yaml up -d

2) 检查各个服务状态以及服务对应的情况:

enter image description here

enter image description here

enter image description here

enter image description here

步骤五:通道创建、节点加入通道

在 peer0.org1.example.com 节点 192.168.100.101 上面进行测试。

1) 进入容器:docker exec -it cli bash

2) 创建通道:peer channel creat

参数:

  • -o:指定 order 节点的 IP 端口
  • -c:通道名称
  • -f:指定通道配置文件路径
  • –tls:与 order 通信是否启用 tls
  • –cafile:使用 tls 时,所使用的 orderer 的证书
peer channel create -o orderer0.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

enter image description here

创建成功后会在当前目录生成 mychannel.block 文件。

3) 加入通道

peer channel join

参数:

  • -b:指定通道文件
peer channel join -b mychannel.block

enter image description here

4) 退出 CLI 容器,保存通道文件 mychannel.block 到宿主机,然后上传给其他服务器,用于其他服务器上的节点加入通道。

复制容器中的 mychannel.block 到宿主机:

docker cp 32fbbf20c9df:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./

enter image description here

拷贝至其他有节点的服务器

scp -r mychannel.block root@192.168.100.102:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster/

scp -r mychannel.block root@192.168.100.103:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster/

步骤六:安装、实例化链码、交易测试

在 peer0.org1.example.com 节点 192.168.100.101 上面进行测试。

在 docker-compose-up.yaml 中我们指定了链码的位置,通过宿主机的 chaincode/go 目录映射到容器中的目录,该链码是官方提供的例子,可以在 fabric-samples/chaincode/chaincode_example02 目录中找到。

enter image description here

enter image description here

1) 进入容器:

docker exec -it cli bash

2) 安装链码 peer chaincode install,链码路径是相对于容器的路径。

参数:

  • -n:链码名称
  • -p:链码的路径
  • -v:版本号
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/  -v 1.0

enter image description here

3) 初始化链码 peer chaincode instantiate,指定背书策略,链码实例化只需要执行一次,其他节点不需要重复实例化操作,实例化时间较长,需要耐心等待。

参数:

  • -o:指定 order 节点的 IP 端口
  • –tls:与 order 通信是否启用 tls
  • –cafile:使用 tls 时,所使用的 orderer 的证书
  • -C:通道名称
  • -n:链码名称
  • -v:版本号
  • -c:请求参数
  • -P:背书策略,此处指定 Org1MSP 或 Org2MSP 中的成员参与背书
peer chaincode instantiate -o orderer0.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","200","b","400"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"

enter image description here

4) 交易查询

peer chaincode query

参数:

  • -C:通道名称
  • -n:链码名称
  • -c:请求参数
peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’

enter image description here

5) 转账交易

peer chaincode invoke

参数:

  • -C:通道名称
  • -n:链码名称
  • -c:请求参数
  • –tls:与 order 通信是否启用 tls
  • –cafile:使用 tls 时,所使用的 orderer 的证书
peer chaincode invoke --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c ‘{“Args”:[“invoke”,“a”,“b”,“20”]}’

enter image description here

此时再查询 a 账户的余额应该为 180。

enter image description here

步骤七:其他 2 个节点加入通道,链码安装、交易测试

1) 192.168.100.102 服务器上,先将上面拷贝的通道配置文件拷贝到容器里面:

docker cp mychannel.block b588d2429319:/opt/gopath/src/github.com/hyperledger/fabric/peer/

enter image description here

2) 加入通道:

peer channel join -b mychannel.block

enter image description here

3) 安装链码:

peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/  -v 1.0

enter image description here

4) 交易查询:

peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’

因为此前已经再 192.168.100.101 上面做了转账交易,所以此时查询余额为 180。

enter image description here

5) 转账查询测试:

peer chaincode invoke --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c ‘{“Args”:[“invoke”,“a”,“b”,“20”]}’

enter image description here

最后一个节点在 192.168.100.103 上,操作同 192.168.100.102。

各位读者在搭建的过程中如果遇到什么问题或者有什么建议都可以在读者圈进行咨询。

点赞 1
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
陈俊飞
陈俊飞
江湖只有他的大名,没有他的介绍。