kafka集群模式下部署fabric
先把 crypto-config.yaml 和 configtx.yaml 两个文件上传到kafka0这个服务器。
找到我们部署单机环境的那个包hyperledger-fabric-linux-amd64-1.4.6.tar.gz
首先,我们在kafka0或者说默认为第一台服务器进行操作。
cd /opt/gopath/src/github.com/hyperledger/fabric/kafkapeer
然后将压缩文件上传到这个目录下,解压,赋权。
(按理来说这里在singlepeer目录下就是这个包,所以可以直接复制过来)
cd /opt/gopath/src/github.com/hyperledger/fabric/singlepeer
cp hyperledger-fabric-linux-amd64-1.4.6.tar.gz /opt/gopath/src/github.com/hyperledger/fabric/kafkapeer/
tar -zxvf hyperledger-fabric-linux-amd64-1.4.6.tar.gz
chmod -R 777 ./bin
然后我们再生成公私钥和证书。
./bin/cryptogen generate --config=./crypto-config.yaml
然后生成创世区块的文件
mkdir channel-artifacts
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
然后生成通道配置文件:
./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
接下来就需要用到我们上一篇文章配置的服务器免密登录了。我们生成的证书文件,为了保证集群的一致性,这里要求8台服务器是用第一台的证书文件的。
cd ..
scp -r kafkapeer root@192.168.137.129:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.130:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.131:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.132:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.133:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.134:/opt/gopath/src/github.com/hyperledger/fabric
scp -r kafkapeer root@192.168.137.135:/opt/gopath/src/github.com/hyperledger/fabric
然后按照上一篇博文给出的文件,一一按照对应,将docker配置文件上传到指定位置。
kafka0应有的文件:
kafka1应有的文件:
kafka2应有的文件:
kafka3应有的文件:
org1peer0应有的文件:
org1peer1应有的文件:
org2peer0应有的文件:
org2peer1应有的文件:
请注意,虽然这里有部分服务器上文件是一样的,但是其实他们内容是不一样的,所以严格按照我给出的文件,对应不同的服务器,不要上传错了。
然后是启动kafka集群。
前文中我们知道,集群是前四个服务器构成的,主要有kafka,orderer,zookeeper三个服务构成。这里我们先启动zookeeper服务器,然后启动Kafka,后面启动orderer。这个顺序是有说法有讲究的,不要随意更改顺序。原因是启动kafka要靠zookeeper基础,然后启动Kafka构建集群,防止集群崩溃之类的,然后orderer作为背书节点要等到前面两个服务启动了才能开启?(我猜的,因为看docker-compose的启动文件是这么理解的)
先启动zookeeper:
zookeeper0(服务器192.168.137.128):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-zookeeper.yaml up -d
zookeeper1(服务器192.168.137.129):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-zookeeper.yaml up -d
zookeeper2(服务器192.168.137.130):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-zookeeper.yaml up -d
然后启动Kafka:
kafka0(服务器192.168.137.128):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-kafka.yaml up -d
kafka1(服务器192.168.137.129):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-kafka.yaml up -d
kafka2(服务器192.168.137.130):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-kafka.yaml up -d
kafka3(服务器192.168.137.131):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-kafka.yaml up -d
最后是启动orderer:
orderer0(服务器192.168.137.128):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-orderer.yaml up -d
orderer1(服务器192.168.137.129):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-orderer.yaml up -d
orderer2(服务器192.168.137.130):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-orderer.yaml up -d
在这里,虽然只有短短几行命令,你只用复制粘贴,但请务必看一下我的这篇文章
https://blog.csdn.net/weixin_44573310/article/details/124254255
而不是简简单单地复制粘贴,否则很有可能即使你看起来服务都已经开启完毕,但是你依旧在创建channel或者加入节点那一步出错:
然后我们来启动peer节点:
org1peer0(服务器192.168.137.132):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-peer.yaml up -d
org1peer1(服务器192.168.137.133):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-peer.yaml up -d
org2peer0(服务器192.168.137.134):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-peer.yaml up -d
org2peer1(服务器192.168.137.135):
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer docker-compose -f docker-compose-peer.yaml up -d
在org1peer0这个服务器里,在kafkapeer目录下,把官方的exampl02示例放进去:
尝试运行我们的fabric网络。
在org1peer0这个服务器里面:
先进入容器:
docker exec -it cli bash
然后指定CA证书位置和创建channel
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer channel create -o orderer0.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile $ORDERER_CA
创建完毕就加入channel:
peer channel join -b mychannel.block
这个时候就先别动了,我们在容器的当前目录下会生成一个区块文件,退出来之后复制出来(有些可能想着安装实例化之后再把创世区块给传出去,这个是不行的哈,只能在还没安装这一步进行操作,具体原因不清楚,大概是如果这边先安装实例化了,对于其他服务器来讲就有一个信息不对称的问题,反正就是当前的mychannel.block文件当中不能有任何的交易记录,这样子讲应该比较容易理解一些)
输入exit退出容器,将我们目前的这个文件保存在其他服务器上。
这里这个命令其实就是将容器内部这个文件复制到物理机kafkapeer这个目录下,所以那个id得自己去看看自己的,不能直接抄,要与自己的一致:
docker cp 2e67a177971a:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block /opt/gopath/src/github.com/hyperledger/fabric/kafkapeer
然后我们在容器外部物理机中就有了这个文件了:
这个时候将这个文件拷贝到其他服务器上去,这里我没开四台虚拟机只开了org1peer0和org2peer0这两个虚拟机,所以我这里只复制到org2peer0这台服务器上,在实际生产的时候,大家注意别漏掉一些服务器了,这个只是为了可怜一下电脑,做个教学:
scp mychannel.block root@192.168.137.134:/opt/gopath/src/github.com/hyperledger/fabric/kafkapeer
注意,这个时候,还是在org1pper0这台机器上进行操作
然后是安装链码,这个随便找个官方的那个example02的例子就行,我是放在/kafkapeer/chaincode/go/example02/这个目录下的。
docker exec -it cli bash
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafkapeer/chaincode/go/example02/ -v 1.0
然后我们实例化一下基本数据(因为刚才退出去了,所以orderer_ca这个指定的环境地址就没了,要重新写一遍,后面可以将这个写到docker的环境变量里面去):
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer chaincode instantiate -o orderer0.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","200","b","400"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
接着查询:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
然后我们在org2peer0这台服务器上启动容器:
docker-compose -f docker-compose-peer.yaml up -d
随后进入:
docker exec -it cli bash
然后我们记下这个时候org2peer0上面启动容器的id,将我们mychannel.block的区块信息输进去:
docker cp /opt/gopath/src/github.com/hyperledger/fabric/kafkapeer/mychannel.block 79b2cc494c8d:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli bash
这个时候我们就不用再创建channel了,因为这个区块信息已经包含了,我们现在需要做的只是加入channel:
peer channel join -b mychannel.block
接着我们就在这个org2peer0服务器安装链码,当然这里需要与之前的org1peer0上的链码保持一致,就是同一个地址的example02的go文件:
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafkapeer/chaincode/go/example02/ -v 1.0
然后我们测试一下,在org2peer0上面。试试A向B转账:
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer chaincode invoke --tls --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'
这个交易的时间可能会稍微久一点,耐心等待;其实在安装实例化链码,进行交易的时候都会通信一会,是正常现象。
然后我们再回到org1peer0这个服务器这里,执行上一步的查询:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
我们就会发现,刚才查询A的余额是200,在经历了org2peer0的转账操作之后,再一次查询就只有180了,这就是kafka集群模式下,多个peer中任意一个peer对区块链上数据进行维护,对于其他的peer来讲都是同步的。这里虽然只用了两台服务器,但无论我开不开那剩下两台,原理都是一样的,差不多这就是整个教程的结束。
下一步就是新建一个peer节点动态加入当前的集群。这里建议大家将每台服务器都备份或者整个镜像出来,毕竟忙活这么久了,万一要是有个什么不测就真的难受了。
Comments | NOTHING