场景:原raft机制的orderer节点不够用,需要进行动态扩充。
先决条件: 已成功运行的网络【可以执行链码的更新和查询操作】
作者环境:
系统环境—— fabric2.3 、docker20系列、java的智能合约
网络环境——已有3个虚拟机进行搭建【虚拟机1:orderer 虚拟机2:peer1.org1 orderer1 虚拟机3:peer1.org2】 以下以VM1 VM2 VM3代替
预计目标: 在VM3内新增orderer2
——————————————————实践走起 ——————————————————
一、先生成orderer2节点的证书文件
方法:1 用fabric系统自带工具 cryptogen进行生成 2 使用fabric—ca进行生成
本文使用的是第一种
1 先修改crypto-config.yaml
修改的配置文件注入初始文件 cryptogen extend --input crypto-config --config ./crypto-config.yaml
【重点 要采用orderer节点的系统环境】 这是我的 大家需要修改自己的文件名
现需要加入系统通道【可不能直接应用通道,会报错的】
export ORDERER_TLSCA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/traceability.com/orderers/orderer.traceability.com/msp/tlscacerts/tlsca.traceability.com-cert.pem
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/traceability.com/users/[email protected]/tls.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/traceability.com/users/[email protected]/msp/
export CORE_PEER_LOCALMSPID="OrdererMSP"
export CH_NAME=fabric.channel
2 获取最新配置区块 peer channel fetch config config_block.pb -o orderer.traceability.com:7050 -c $CH_NAME --tls --cafile $ORDERER_TLSCA
3 从config_block.pb中提取有效的数据,并转换成可编辑json格式 configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
4 生成新的区块配置文件modified_config.json 需要修改俩处【对config.json中进行复制就好 】
即 cp config.json modified_config.json
第一处
在orderer1后面添加 注意新的orderer2证书 其中server.cert需要转化base64编码
cat crypto-config/ordererOrganizations/traceability.com/orderers/orderer2.traceability.com/tls/server.crt | base64 > cert.txt 其中可以查看证书明细
第二处
5 对俩个json进行编码 configtxlator proto_encode --input modified_config.json --type common.Config --output config.pb configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
6 计算出两个文件的差异 configtxlator compute_update --channel_id fabric.channel --original config.pb --updated modified_config.pb --output config_update.pb
7 对文件差异进行解码并添加用于更新配置的头部信息:
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"fabric.channel", "type":3}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json [注意type为新增orderer序列]
8 把封装好的json文件转换回pb格式文件
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
9 对该文件进行签名操作,用于更新配置
peer channel signconfigtx -f updated_envelope.pb
10 提交更新请求
peer channel update -f channel-artifacts/updated_envelope.pb -c byfn-sys-channel -o orderer1.example.com:7050 --tls true --cafile $ORDERER_CA
提交成功后出现如下:
同理 重复如上过程,将系统通道CH_NAME(fabric.channel)切换为应用通道mychannel 即可
最终启动编写的orderer2.yaml文件
稍等一下 打印日志就可以看到上线成功,raft集群变为3
动态填加org组织也是同样的道理