Fabric网络升级

将节点和通道升级到 Fabric 的最新版本,总体来说,有四步:
1.备份账本和 MSP。
2.以滚动的方式将 orderer 二进制文件升级到最新版本。
3.以滚动方式将 peer 二进制文件升级到最新版本。
4.在可用的情况下,将 orderer 系统通道和所有应用通道更新到最新功能。
需要注意,某些版本在所有组中将具有功能,而其他版本可能几乎没有甚至根本没有新功能。

在升级peer节点前,需要先升级peer数据库
所有peer节点的数据库(状态数据库、历史数据库、peer节点的其他数据库),都必须使用v2.x数据格式进行重建,这是升级到v2.x版本的一部分。

使用peer node upgrade-dbs命令来删除本地数据库并为升级做好准备
重建操作,在peers节点启动前需要删除数据库,在启动v2.xpeers节点的第一时间,所有的数据库都会被重建。

状态数据库:
若使用CouchDB作为状态数据库
要启用该支持,需要你配置peer使用CouchDB,且在执行upgrade-dbs命令前启动CouchDB。
v2.0和v2.1中,peer并不支持自动删除CouchDB数据库,你需要自己手动删除。v2.2的peers支持自动删除CouchDB

1.Fabric v1.4.0升级到1.4.6【solo模式下】

  • 尝试用另一种方法升级(参考)
docker run -d -v /opt/backup/$ORDERER_CONTAINER/:/var/hyperledger/production/orderer/ \
            -v /opt/msp/:/etc/hyperledger/fabric/msp/ \
            --env-file ./env<name of node>.list \
            --name $ORDERER_CONTAINER \
            hyperledger/fabric-orderer:$IMAGE_TAG orderer 
  • 升级couchdb

前期准备
 1. v1.4.0Fabric网络
 2.  v1.4.6 docker镜像:
         hyperledger/fabric-ca
         hyperledger/fabric-tools
         hyperledger/fabric-peer
         hyperledger/fabric-orderer
         hyperledger/fabric-ccenv
         hyperledger/fabric-baseos

1.1 升级orderer节点

(1)升级Order节点前先配置如下环境变量

# 排序节点的容器名称,注意:每个节点升级时都设置一遍
$ export ORDERER_CONTAINER=orderer.example.com
# 存放备份数据的路径
$ export LEDGERS_BACKUP=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples/first-network/ledgers-backup
# 期望升级到的Fabric版本,例如v2.0
$ export IMAGE_TAG=1.4.6
$ export FABRIC_SAMPLES=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples

(2)停止orderer容器

$ docker stop $ORDERER_CONTAINER

(3)创建备份文件

$ mkdir -p $LEDGERS_BACKUP

(4)备份fabric1.4.0的账本和MSP (此时fabric网络已经启动,从启动的容器中获取)

$ docker cp $ORDERER_CONTAINER:/var/hyperledger/production/orderer/ $LEDGERS_BACKUP/$ORDERER_CONTAINER

(5) 删除orderer容器

$ docker rm -f $ORDERER_CONTAINER 

(6) 升级容器

$ docker run -d -v $LEDGERS_BACKUP/$ORDERER_CONTAINER/:/var/hyperledger/production/orderer/ -v $FABRIC_SAMPLES/first-network/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block -v $FABRIC_SAMPLES/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp -v $FABRIC_SAMPLES/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls  --env-file ./env_order.list  --net net_byfn --name $ORDERER_CONTAINER  -p 7050:7050 hyperledger/fabric-orderer:$IMAGE_TAG orderer 

其中上面命令中env_order.list文件中的配置信息如下(env_order.list创建在firts_network目录下)

FABRIC_LOGGING_SPEC=INFO
FABRIC_CFG_PATH=/etc/hyperledger/fabric
ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
ORDERER_GENERAL_GENESISMETHOD=file
ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
ORDERER_GENERAL_LOCALMSPID=OrdererMSP
ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
ORDERER_GENERAL_TLS_ENABLED=true
ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
ORDERER_KAFKA_VERBOSE=true
ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

1.2 升级peer节点(以peer0.org1.example.com为例,其他peer节点升级类似)

(1)升级peer节点前先配置如下环境变量

# peer节点的容器名称,注意:每个节点升级时都设置一遍,此处以peer0.org1.example.com为例
$ export PEER_CONTAINER=peer0.org1.example.com
# 存放备份数据的路径
$ export LEDGERS_BACKUP=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples/first-network/ledgers-backup
# 期望升级到的Fabric版本,例如v2.0
$ export IMAGE_TAG=1.4.6

(2) 停止容器

$ docker stop $PEER_CONTAINER

(3) 创建备份文件(有则不用创建)

$ mkdir -p $LEDGERS_BACKUP

(4) 备份Peer的账本和MSP

$ docker cp $PEER_CONTAINER:/var/hyperledger/production $LEDGERS_BACKUP/$PEER_CONTAINER

(5) 删除CC容器

$ CC_CONTAINERS=$(docker ps | grep dev-$PEER_CONTAINER | awk '{print $1}')
$ if [ -n "$CC_CONTAINERS" ] ; then docker rm -f $CC_CONTAINERS ; fi

(6) 删除CC镜像

$ CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}')
$ if [ -n "$CC_IMAGES" ] ; then docker rmi -f $CC_IMAGES ; fi

(7) 删除peer容器

$ docker rm -f $PEER_CONTAINER

(8) 升级peer节点数据库升级时暂时没有用到

$ docker run --rm -v $LEDGERS_BACKUP/$PEER_CONTAINER:/var/hyperledger/production/ -v /var/run/:/host/var/run/ -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls -p 7051:7051 --env-file env_peer.list --net net_byfn --name $PEER_CONTAINER  hyperledger/fabric-peer:$IMAGE_TAG peer node upgrade-dbs

(9) 升级peer节点

$ docker run -d -v $LEDGERS_BACKUP/$PEER_CONTAINER:/var/hyperledger/production/ -v /var/run/:/host/var/run/ -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls -p 7051:7051 --env-file env_peer.list --net net_byfn --name $PEER_CONTAINER  hyperledger/fabric-peer:$IMAGE_TAG peer node start

其中上面命令中env_peer.list文件中的配置信息如下(env_peer.list创建在firts_network目录下)

CORE_PEER_LOCALMSPID=Org1MSP
CORE_PEER_GOSSIP_USELEADERELECTION=true
CORE_PEER_ID=peer0.org1.example.com
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
FABRIC_CFG_PATH=/etc/hyperledger/fabric
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net_byfn
CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
CORE_PEER_PROFILE_ENABLED=true
CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
CORE_PEER_LISTENADDRESS=0.0.0.0:7051
CORE_PEER_GOSSIP_ORGLEADER=false
CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051
CORE_PEER_TLS_ENABLED=true
FABRIC_LOGGING_SPEC=INFO
CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052

1.3 编写一个测试test1.sh脚本,将上面命令依次执行

test1.sh脚本内容如下,在终端可以的./first-network路径下直接执行命令./test1命令,执行如下命令

#!/bin/bash
#this is a script

#启动fabric1.4.0网络
echo "====================================fabric1.4.0===================================="
./byfn.sh up

#检查运行中的容器
echo "====================================检查运行中的容器===================================="
docker ps 

#进入cli容器中,执行账本查询,展示查询结果
echo "====================================进入cli容器中,执行账本查询===================================="
docker exec -it cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

#升级到orderer节点到fabric1.4.6
echo "====================================升级orderer节点  Upgrading orderer to 1.4.6===================================="
export ORDERER_CONTAINER=orderer.example.com
export LEDGERS_BACKUP=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples/first-network/ledgers-backup
export IMAGE_TAG=1.4.6
export FABRIC_SAMPLES=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples

# 停止orderer容器
echo "====================================停止orderer容器===================================="
docker stop $ORDERER_CONTAINER

# 创建备份文件
mkdir -p $LEDGERS_BACKUP

# 备份1.4.6的账本和MSP (从容器中获取)
docker cp $ORDERER_CONTAINER:/var/hyperledger/production/orderer/ $LEDGERS_BACKUP/$ORDERER_CONTAINER

# 删除orderer容器
echo "====================================删除orderer容器===================================="
docker rm -f $ORDERER_CONTAINER 

# 升级容器
echo "====================================升级orderer容器===================================="
docker run -d -v $LEDGERS_BACKUP/$ORDERER_CONTAINER/:/var/hyperledger/production/orderer/ -v $FABRIC_SAMPLES/first-network/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block -v $FABRIC_SAMPLES/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp -v $FABRIC_SAMPLES/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls  --env-file ./env_order.list  --net net_byfn --name $ORDERER_CONTAINER  -p 7050:7050 hyperledger/fabric-orderer:$IMAGE_TAG orderer

#升级到peer节点到fabric1.4.6
echo "====================================升级peer节点===================================="
    for PEER_CONTAINER in peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com; do
      echo "Upgrading peer $PEER_CONTAINER"
      export LEDGERS_BACKUP=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples/first-network/ledgers-backup
      export IMAGE_TAG=1.4.6
      export FABRIC_SAMPLES=/home/lijiangtao/go/src/github.com/hyperledger/fabric-samples

      # Stop the peer and backup its ledger
      # 停止容器
      echo "====================================停止$PEER_CONTAINER容器===================================="
      docker stop $PEER_CONTAINER
      
      # 创建备份文件夹(有则不用创建)
      mkdir -p $LEDGERS_BACKUP

      # 备份Peer的账本和MSP
      docker cp $PEER_CONTAINER:/var/hyperledger/production $LEDGERS_BACKUP/$PEER_CONTAINER
      

      # Remove any old containers and images for this peer
      # 删除CC容器
      CC_CONTAINERS=$(docker ps | grep dev-$PEER_CONTAINER | awk '{print $1}')
      if [ -n "$CC_CONTAINERS" ]; then
        docker rm -f $CC_CONTAINERS
      fi
      # 删除CC镜像
      CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}')
      if [ -n "$CC_IMAGES" ]; then
        docker rmi -f $CC_IMAGES
      fi

      # 删除peer容器
      echo "====================================删除$PEER_CONTAINER容器===================================="
      docker rm -f $PEER_CONTAINER

      # 升级peer节点
      if [ "$PEER_CONTAINER" == "peer0.org1.example.com" ]; then
	PORT="7051"
      elif [ "$PEER_CONTAINER" == "peer1.org1.example.com" ]; then
	PORT="8051"
      elif [ "$PEER_CONTAINER" == "peer0.org2.example.com" ]; then
        PORT="9051"
      else
        PORT="10051"
      fi
      docker run -d -v $LEDGERS_BACKUP/$PEER_CONTAINER:/var/hyperledger/production/ -v /var/run/:/host/var/run/ -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp -v $FABRIC_SAMPLES/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls -p $PORT:$PORT --env-file env_peer.list --net net_byfn --name $PEER_CONTAINER  hyperledger/fabric-peer:$IMAGE_TAG peer node start
      
    done
echo "====================================升级peer节点 结束===================================="


echo "====================================升级cli===================================="
docker-compose -f docker-compose-cli.yaml up -d --no-deps cli


#检查运行中的容器
echo "====================================升级后 检查运行中的容器===================================="
docker ps

echo "====================================进入cli容器中,执行账本查询===================================="
docker exec -it cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]'


echo '停止容器'
docker stop cli orderer.example.com peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com

echo '关闭容器'
docker rm cli orderer.example.com peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com

echo '查看当前运行的容器'
docker ps 

echo '停止fabric网路'
./byfn.sh down

参考:
[1].Fabric v1.4.x升级至v2.2.0
[2].Upgrading your components
[3].docker中的hassio升级_fabric升级教程

参考

[2].Fabric升级示例
[3].Fabric网络升级(一)
[4].Fabric网络升级(二)
[5].Fabric网络升级(三)
[6].Fabric网络升级(四)
[7].Fabric网络升级(总)
[8].Fabric 2.0新特性
[9].Hyperledger Fabric的容灾备份及恢复方法简介

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值