超级账本多服务器fabric部署

                                            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

猜你喜欢

转载自my.oschina.net/u/2343310/blog/1786147
今日推荐