Hyperledger Fabric 是一个开源的企业级许可分布式分类帐技术(DLT)平台,专为在企业环境中使用而设计。
Hyperledger Fabric 是一个开源的企业级许可分布式分类帐技术(DLT)平台,专为在企业环境中使用而设计。有基础的同学应该都对 Hyperledger Fabric 共识机制有一点了解,Fabric 共识机制分为 Solo、Kafka。
Solo 模式存在单点故障问题,容易导致网络瘫痪,不适用于生产;因此生产推荐使用 Kafka。Kafka 依赖 ZooKeeper,可以容忍部分节点失效。本 Chat 将基于 Kafka 共识实现排序节点的分布式网络搭建,采用图文的方式让读者更加容易理解。
主要内容有:
本次环境搭建将基于 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
firewall-cmd --state
systemctl stop firewalld.service
systemctl disable firewalld.service
备注:4 台机器都要进行基础环境的搭建。
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
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
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/
4) 配置立即生效:
source /etc/profile
5) 验证:
go version
在 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、镜像、二进制文件。
二进制文件默认下载到 fabric-samples 下面的 bin 目录:
建议可以将其加入到 PATH 环境变量中,这样可以在任意位置执行这些命令,编辑 /etc/profile,新增以下配置,保存退出后执行 source /etc/profile 使配置生效。
export PATH=$PATH:/root/go/src/github.com/hyperledger/fabric-samples/bin
使用 docker images
命令查看已经下载的镜像。
因编辑器原因,我将 Kafka 集群部署涉及的所有文件单独放到 这篇文章中。
在 192.168.100.100 服务器上操作
cd $GOPATH/src/github.com/hyperledger/fabric-samples
创建目录
mkdir kafka_cluster
后续操作都在该目录下。
新增 crypto-config.yaml 文件:
新增 configtx.yaml 文件:
1) 生成证书跟私钥文件
cryptogen generate --config=./crypto-config.yaml
查看目录结构
2) 生成创世区块及通道配置区块
创建目录:mkdir channel-artifacts
使用 configtxgen 生成创世区块:
configtxgen -channelID kafka-channel -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
其中
3) 使用 configtxgen 生成创世区块
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
其中
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
详细代码见
1) 分别在 4 个服务器启动所有服务:
docker-compose -f docker-compose-up.yaml up -d
2) 检查各个服务状态以及服务对应的情况:
在 peer0.org1.example.com 节点 192.168.100.101 上面进行测试。
1) 进入容器:docker exec -it cli bash
2) 创建通道:peer channel creat
参数:
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
创建成功后会在当前目录生成 mychannel.block 文件。
3) 加入通道
peer channel join
参数:
peer channel join -b mychannel.block
4) 退出 CLI 容器,保存通道文件 mychannel.block 到宿主机,然后上传给其他服务器,用于其他服务器上的节点加入通道。
复制容器中的 mychannel.block 到宿主机:
docker cp 32fbbf20c9df:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./
拷贝至其他有节点的服务器
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 目录中找到。
1) 进入容器:
docker exec -it cli bash
2) 安装链码 peer chaincode install
,链码路径是相对于容器的路径。
参数:
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/ -v 1.0
3) 初始化链码 peer chaincode instantiate
,指定背书策略,链码实例化只需要执行一次,其他节点不需要重复实例化操作,实例化时间较长,需要耐心等待。
参数:
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')"
4) 交易查询
peer chaincode query
参数:
peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
5) 转账交易
peer chaincode invoke
参数:
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”]}’
此时再查询 a 账户的余额应该为 180。
1) 192.168.100.102 服务器上,先将上面拷贝的通道配置文件拷贝到容器里面:
docker cp mychannel.block b588d2429319:/opt/gopath/src/github.com/hyperledger/fabric/peer/
2) 加入通道:
peer channel join -b mychannel.block
3) 安装链码:
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/ -v 1.0
4) 交易查询:
peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
因为此前已经再 192.168.100.101 上面做了转账交易,所以此时查询余额为 180。
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”]}’
最后一个节点在 192.168.100.103 上,操作同 192.168.100.102。
各位读者在搭建的过程中如果遇到什么问题或者有什么建议都可以在读者圈进行咨询。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!