前言
简单来说:
- 升级二进制文件:orderer,ca,peer;
- 升级客户端sdk
- 升级kafka集群(可选)
注意,这篇教程仅仅是如何从1.3升级到1.4,不是其他版本到1.4。
在升级前,最好,备份账本和MSPs。然后编译orderer和peer二进制文件。我们将通过cli命令来操作。
我们将使用fabric-samples/first-network来作为示例:
![ed613dd641b93aea8f2d383d730eccc6.png](https://img-blog.csdnimg.cn/img_convert/ed613dd641b93aea8f2d383d730eccc6.png)
启动fabric 1.3
清除环境:./byfn.sh down
启动网络:
git checkout v1.3.0./byfn.sh generate./byfn.sh up -t 3000 -i 1.3.0
结果:
===================== All GOOD, BYFN execution completed =====================
到现在我们已经做好升级的准备了。
如果有错误,请自行检查。
自动升级
获取最新的代码:
git fetch origingit checkout v1.4.0
我们可以直接利用fabric-samples提供的脚本直接升级,如下:
# Note, replace '1.4.x' with a specific version, for example '1.4.0'.# Don't pass the image flag '-i 1.4.x' if you prefer to default to 'latest' images../byfn.sh upgrade -i 1.4.x
如果一切没有问题,我们会看到下面的结果:
===================== All GOOD, End-2-End UPGRADE Scenario execution completed =====================
当然,这是自动升级,下面我们来看下如何手动升级。
手动升级
升级Orderer容器
Orderer容器应该用滚动的方式来升级,即每次只升级一个。可以分为以下几步:
- 停掉Orderer容器
- 备份Orderer的账本和MSP
- 使用1.4的Orderer镜像来重启Orderer容器
- 验证升级是否成功
具体来说。
- 停掉docker容器:
docker stop orderer.example.comexport LEDGERS_BACKUP=./ledgers-backup# Note, replace '1.4.x' with a specific version, for example '1.4.0'.# Set IMAGE_TAG to 'latest' if you prefer to default to the images tagged 'latest' on your system.export IMAGE_TAG=$(go env GOARCH)-1.4.x
2.备份Orderer的账本和MSP
mkdir -p $LEDGERS_BACKUPdocker cp orderer.example.com:/var/hyperledger/production/orderer/ ./$LEDGERS_BACKUP/orderer.example.com
- 使用1.4的Orderer镜像来重启Orderer容器
docker-compose -f docker-compose-cli.yaml up -d --no-deps orderer.example.com
在示例中,我们使用的是solo模式,但是在生产环境中,我们使用kafka,所以在启动之后,我们最好使用下面的命令来看看是不是可以与其他的orderer进行通信:
peer channel fetch
升级Peer容器
Peer容器应该用滚动的方式来升级,即每次只升级一个。可以分为以下几步:
- 停掉Peer容器
- 备份Peer的账本和MSP
- 删除Chaincode容器和镜像
- 使用1.4的Peer镜像来重启Peer容器
- 验证升级是否成功
具体来说:
- 停掉Peer容器
export PEER=peer0.org1.example.com
docker stop $PEER
2.备份Peer的账本和
mkdir -p $LEDGERS_BACKUP
docker cp $PEER:/var/hyperledger/production ./$LEDGERS_BACKUP/$PEER
3.删除Chaincode容器和镜像
CC_CONTAINERS=$(docker ps | grep dev-$PEER | awk '{print $1}')
if [ -n "$CC_CONTAINERS" ] ; then docker rm -f $CC_CONTAINERS ; fi
CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}')
if [ -n "$CC_IMAGES" ] ; then docker rmi -f $CC_IMAGES ; fi
- 使用1.4的Peer镜像来重启Peer容器
docker-compose -f docker-compose-cli.yaml up -d --no-deps $PEER
docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d --no-deps $PEER
- 验证升级是否成功在验证之前,需要升级足够的节点来获取足够的背书,但是不同版本的peer也可能进行背书。在验证之前,我们还需要升级cli:docker-compose -f docker-compose-cli.yaml stop cli
docker-compose -f docker-compose-cli.yaml up -d --no-deps cli也可以指定1.3的版本的cli
couchDB需要使用下面的命令:
IMAGE_TAG=$(go env GOARCH)-1.3.x docker-compose -f docker-compose-cli.yaml up -d --no-deps cli
然后,进去容器cli,设置环境变量,执行链码调用,在此之前,a已经向b转了10元,这次又转了10元,所以a还剩80。
docker exec -it cli bash
CH_NAME=mychannelORDERER_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 invoke -o orderer.example.com:7050 --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --tls --cafile $ORDERER_CA -C $CH_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
export PEER=peer1.org1.example.comexport PEER=peer0.org2.example.comexport PEER=peer1.org2.example.com
其他
升级kafka集群和zookeeper
新版本的kafka支持旧版本的协议。
升级CouchDB
fabric1.4中支持CouchDB2.0.0了。
- 停止CouchDB
- 备份数据
- 使用v2.0.0的二进制文件或者docker镜像
- 重启CouchDB
升级Chaincodes
Upgrade Chaincodes with vendored shim
如果你的Chaincode在vendor里面,你需要升级,或者不需要升级。
结束语
下面我把完整的脚本放在这里,来自fabric-samples:
# Upgrade the network components which are at version 1.3.x to 1.4.x# Stop the orderer and peers, backup the ledger for orderer and peers, cleanup chaincode containers and images# and relaunch the orderer and peers with latest tagfunction upgradeNetwork() { if [[ "$IMAGETAG" == *"1.4"* ]] || [[ $IMAGETAG == "latest" ]]; then docker inspect -f '{{.Config.Volumes}}' orderer.example.com | grep -q '/var/hyperledger/production/orderer' if [ $? -ne 0 ]; then echo "ERROR !!!! This network does not appear to start with fabric-samples >= v1.3.x?" exit 1 fi LEDGERS_BACKUP=./ledgers-backup # create ledger-backup directory mkdir -p $LEDGERS_BACKUP export IMAGE_TAG=$IMAGETAG COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}" if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}" export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk) export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk) fi if [ "${IF_COUCHDB}" == "couchdb" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}" fi # removing the cli container docker-compose $COMPOSE_FILES stop cli docker-compose $COMPOSE_FILES up -d --no-deps cli echo "Upgrading orderer" docker-compose $COMPOSE_FILES stop orderer.example.com docker cp -a orderer.example.com:/var/hyperledger/production/orderer $LEDGERS_BACKUP/orderer.example.com docker-compose $COMPOSE_FILES up -d --no-deps orderer.example.com for PEER in peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com; do echo "Upgrading peer $PEER" # Stop the peer and backup its ledger docker-compose $COMPOSE_FILES stop $PEER docker cp -a $PEER:/var/hyperledger/production $LEDGERS_BACKUP/$PEER/ # Remove any old containers and images for this peer CC_CONTAINERS=$(docker ps | grep dev-$PEER | awk '{print $1}') if [ -n "$CC_CONTAINERS" ]; then docker rm -f $CC_CONTAINERS fi CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}') if [ -n "$CC_IMAGES" ]; then docker rmi -f $CC_IMAGES fi # Start the peer again docker-compose $COMPOSE_FILES up -d --no-deps $PEER done docker exec cli scripts/upgrade_to_v14.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE if [ $? -ne 0 ]; then echo "ERROR !!!! Test failed" exit 1 fi else echo "ERROR !!!! Pass the v1.4.x image tag" fi}