fabric多服务器集群部署
系统环境:
centos 7.3
服务器地址列表:
A:10.36.8.106 peer0.org1.example.com
B: 10.36.8.107 peer1.org1.example.com
C: 10.36.8.108 peer0.org2.example.com
D: 10.36.8.109 peer1.org2.example.com
E: 10.36.8.222 orderer.example.com
软件环境:
每台服务器都得进行单服务器多节点测试通过(见上篇)
镜像下载过程可以优化,只下载一台然后拷贝到其它机器
docker save `docker images | awk 'NR>1{print $1}'` -o images
scp images hosts:/tmp
其它机器加载docker镜像
docker load -i images
单服务器测试通过后必须关掉所有的容器,执行此命令即可
./network_setup.sh down
多服务器开始配置:
A:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
2 修改docker-compose-cli.yaml(目录/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
在默认的情况下,docker-compose-cli.yaml会启动6个service(容器),它们分别为 peer0.org1.example.com、 peer1.org1.example.com、 peer0.org2.example.com、
peer1.org2.example.com、 orderer.example.com 和 cli,因为每台机器只运行与之对应的一个节点,因此需要注释掉无需启动的 service。
2.1
除 peer0.org1.example.com 和 cli service 外,其他 service 全部注释。
2.2
在 cli 的 volumes 中加入映射关系如下(添加这个的目的主要是后面会产生一个链的认证文件在peer目录下,方便获取):
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
注释 cli 中的 depends_on 和 command :
depends_on:
#- orderer.example.com
- peer0.org1.example.com
#- peer1.org1.example.com
#- peer0.org2.example.com
#- peer1.org2.example.com
#command: /bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT’
3 修改 base/peer-base.yaml,添加 volumes(方便容器能访问到order):
volumes:
-/etc/hosts:/etc/hosts
B:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.106 peer0.org1.example.com
2 修改docker-compose-cli.yaml(目录/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
类似VM1,除 peer1.org1.example.com 和 cli service 外,其他 service 全部注释。
2.2
在 cli 的 volumes 中加入映射关系:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
注释cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
- peer1.org1.example.com
#- peer0.org2.example.com
#- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的环境变量
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
3 修改base/peer-base.yaml,同VM1的修改。
C:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.106 peer0.org1.example.com
2 修改docker-compose-cli.yaml(目录/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
类似VM1,除peer0.org2.example.com 和 cli service 外,其他 service 全部注释。
2.2
在 cli 的 volumes 中加入映射关系:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
注释cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
#- peer1.org1.example.com
- peer0.org2.example.com
#- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的环境变量(CORE_PEER_TLS_CERT_FILE、CORE_PEER_TLS_KEY_FILE这两个变量不要修改)
CORE_PEER_LOCALMSPID=”Org2MSP”
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
3 修改base/peer-base.yaml,同VM1的修改。
D:
1 修改 /etc/hosts,添加路由映射
10.36.8.222 orderer.example.com
10.36.8.108 peer0.org2.example.com
2 修改docker-compose-cli.yaml(目录/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli)
2.1
类似VM1,除peer1.org2.example.com和cliservice 外,其他 service 全部注释。
2.2
在 cli 的 volumes 中加入映射关系:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
- /etc/hosts:/etc/hosts
2.3
注释cli中的 depends_on 和 command:
depends_on:
#- orderer.example.com
#- peer0.org1.example.com
#- peer1.org1.example.com
#- peer0.org2.example.com
- peer1.org2.example.com
#command:/bin/bash -c ‘./scripts/script.sh CHANNELNAME;sleepTIMEOUT
2.4
修改cli中的环境变量(CORE_PEER_TLS_CERT_FILE、CORE_PEER_TLS_KEY_FILE这两个变量不要修改)
CORE_PEER_LOCALMSPID=”Org2MSP”
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
3 修改base/peer-base.yaml,同VM1的修改。
E:
修改docker-compose-cli.yaml
除orderer外的其他 service 全部注释,即只启动 orderer
至此基本配置完成
多服务器开始启动
1:上述机器任选一台
cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli
执行 ./generateArtifacts.sh ,产生channel-artifacts/ 和 crypto-config/两个目录(里面有 orderer 和 peer 的证书、私钥和以及用于通信加密的tls证书等文件,它通过 configtx.yaml 配置文件生成)
图片
把这两个目录拷贝到其它所有机器
tar -zcf cert.tar.gz channel-artifacts crypto-config
scp cert.tar.gz 10.36.8.106:/tmp
无论其它机器是否有都直接覆盖(因为所有机器证书必须一致)
\cp -ar channel-artifacts/* /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/channel-artifacts/
\cp -ar crypto-config/* /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/
2: 先启动order节点E
docker-compose -f docker-compose-cli.yaml up -d
通过docker ps 查看容器orderer.example.com是否存在
3:A和B同属组织Org1MSP,C和D同属组织Org2MSP,但是A是B的初始节点,C是D的初始节点,所以得先启动A和C
我这里先启动A
docker-compose -f docker-compose-cli.yaml up -d
docker ps 查看 cli 和peer0.org1.example.com 容器是否存在
进入cli容器
docker exec -it cli bash
用于给order认证的证书
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
创建mychannel,会在当前目录下产生一个mychannel.block文件,其他节点加入此链的话需要此证书文件,所以需要拷贝至其它所有节点的相同目录下
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
把 peer0.org1.example.com 加入到 mychannel 中:
peer channel join -b mychannel.block
更新 mychannel 中 org1 的 anchor peer 的信息:
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
安装 chaincode 示例 chaincode_example02 到 peer0.org1.example.com 中:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
这时候 chaincode 代码已经安装到了 peer0 节点上,但并未实例化运行。接下来先配置好其他节点
B:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bash
peer channel join -b mychannel.block
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
C:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bash
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer channel join -b mychannel.block
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
D:
docker-compose -f docker-compose-cli.yaml up -d
docker exec -it cli bash
peer channel join -b mychannel.block
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
至此都已启动完毕
多服务器开始实例化并调试:
1 除order外人选一台实例化
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
去其他所有节点查询都可以查看到刚实例化的值
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
并且会发现都生成了一个新的容器
docker ps
2 发生交易:invoke
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","50"]}'
重新查询:实例化的变量是否发生改变
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
3 更新
安装新版本
peer chaincode install -n mycc -v 2.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
新版里初始化两个变量
peer chaincode upgrade -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 2.0 -c '{"Args":["init","c","10","d","20"]}'
通过新版本去查现在的值以及之前的值是否都正常
peer chaincode query -C mychannel -n mycc -v 2.0 -c '{"Args":["query","c"]}'
peer chaincode query -C mychannel -n mycc -v 2.0 -c '{"Args":["query","a"]}'
并且会产生一个2.0的新容器
其他节点通过orderer来同步更新,但是其他节点想要修改和访问,必须得先安装最新的chaincode,否则会报错
peer chaincode install -n mycc -v 2.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
当上述有的节点失败时可以重新来过
fabric根下修改Makefile(/opt/gopath/src/github.com/hyperledger/fabric)
注释 docker rmi 删除镜像这行
docker stop `docker ps |awk 'NR>1{print $1}'`;docker rm `docker ps -a|awk 'NR>1{print $1}'`
make clean
mychannel下创建其他chaincode
所有节点安装chaincode:
peer chaincode install -n twocc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
任选节点实例化:
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n twocc -v 1.0 -c '{"Args":["init","e","100","f","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
只是每一次创建一个新的chaincode实例化时会产生一个新的容器,其他的节点在首次查询时也会创建这个心的容器,所以需要等待一定的时间
注:1、因为是内网操作域名得写host,所以只要加必要的就行,本地启动以为ipv6启动的,如果本地host写自己基于ipv4的,将会出现无法bind
host-192-168-1-100 journal: panic: listen tcp 10.36.8.106:7052: bind: cannot assign requested address
2、删除重来的时候记得把之前的创建chaincode镜像也删掉,不然如果重新初始化之前的会报错
3、如果order证书重新载入了,得重启order以及所有节点相关的容器
4、如果某个组织初始化的那一台出现问题,则重启这个节点的所有容器,同时得删除之前创建的链容器及镜像,重新进入cli控制台查询会
重新创建这个链的容器,否则这个组织下的其他节点能查询修改,但是不会有变化,因为收不到最新的order消息
docker操作命令
docker rmi -f 镜像id 强制删除镜像
docker rmi -f `docker images |awk 'NR > 1{ print $3}'`
docker rm 容器id或名字 删除已停止的容器,运行状态的容器得先stop
docker start/stop/restart name or id
docker ps -a |grep name |awk '{print $NF}'
docker stop `docker ps |awk 'NR>1{print $1}'`;docker rm `docker ps -a|awk 'NR>1{print $1}'`
docker ps -a 获取所有的容器信息, -q 获取所有的容器id(包括所有状态的)
docker inspect 容器id
docker logs 容器id 获取对这个容器操作的日志信息
docker commit 容器id job1 将容器的状态保存为镜像,镜像名称只能取字符[a-z]和数字[0-9]
docker简书:https://www.jianshu.com/p/2217cfed29d7