如何向运行中的Hyperledger Fabric网络添加更多Orderer节点
给运行中的Hyperledger Fabric生产网络添加Orderer节点
嘿,我来帮你一步步搞定这个事儿——给已运行的Fabric生产网络加Orderer节点是很常见的扩缩容操作,不用太担心,跟着下面的步骤来就行:
前置准备
- 先把当前网络的最新配置文件都备齐:包括
configtx.yaml、crypto-config.yaml,还有Orderer组织的MSP证书目录,别拿旧版本的,不然容易出问题 - 确认现有单Orderer节点状态健康:通道交易能正常处理,日志里没报错,这点是基础
- 新Orderer节点的环境要和现有节点完全匹配:Fabric版本一模一样,操作系统、依赖包也尽量对齐,版本不兼容真的会坑死人
步骤1:生成新Orderer节点的加密材料
如果用cryptogen工具(生产环境更推荐CA,但如果之前用的是cryptogen)
- 打开
crypto-config.yaml,找到Orderer组织的Template字段,把Count改成你想要的总节点数(比如原来1个,现在要3个就改成3) - 重新生成加密材料:
cryptogen generate --config=./crypto-config.yaml - 把新生成的Orderer节点证书目录(比如
crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com)复制到新节点服务器的对应路径,比如/opt/fabric/crypto/orderer
如果用Fabric CA(生产环境推荐)
- 先给新Orderer节点注册身份,再签发证书:
# 注册身份 fabric-ca-client register --id.name orderer2.example.com --id.type orderer --id.affiliation orderer --id.secret yourOrderer2Password # 拉取证书 fabric-ca-client enroll -u http://orderer2.example.com:yourOrderer2Password@ca-orderer.example.com:7054 -M /opt/fabric/crypto/orderer/msp - 把CA的根证书、中间证书复制到新节点的MSP目录下,确保结构和现有Orderer节点完全一致(比如
msp/cacerts、msp/tlscacerts这些目录都要有对应的文件)
步骤2:更新通道配置(最关键的一步)
要把新Orderer节点加入到通道的配置里,这步必须做:
- 从现有Orderer节点拉取通道的最新配置区块:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c yourChannelName --tls --cafile /opt/fabric/crypto/orderer/tls/ca.crt - 把配置区块转成JSON格式方便编辑:
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json jq .data.data[0].payload.data.config config_block.json > config.json - 创建修改后的配置文件,添加新Orderer节点:
- 复制
config.json为modified_config.json - 在
modified_config.json里找到channel_group.groups.Orderer.values.OrdererAddresses.config.addresses,把新Orderer的地址加进去(比如"orderer2.example.com:7050") - 用
configtxlator计算配置差异并打包:# 转成proto格式 configtxlator proto_encode --input config.json --type common.Config --output config.pb configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb # 计算更新 configtxlator compute_update --channel_id yourChannelName --original config.pb --updated modified_config.pb --output config_update.pb # 转回JSON configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json # 打包成信封格式 echo '{"payload":{"header":{"channel_header":{"channel_id":"yourChannelName", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
- 复制
- 签名并提交配置更新:
- 用Orderer组织的管理员身份签名(必须符合通道的签名策略):
peer channel signconfigtx -f config_update_in_envelope.pb - 提交到现有Orderer节点:
peer channel update -f config_update_in_envelope.pb -c yourChannelName -o orderer.example.com:7050 --tls --cafile /opt/fabric/crypto/orderer/tls/ca.crt
- 用Orderer组织的管理员身份签名(必须符合通道的签名策略):
步骤3:启动新Orderer节点
- 准备启动配置(以Docker部署为例,裸金属部署类似):
编写docker-compose-orderer2.yaml,关键配置要和现有节点对齐:version: '2' services: orderer2.example.com: image: hyperledger/fabric-orderer:${FABRIC_VERSION} environment: - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_LISTENPORT=7050 - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp # TLS配置(生产环境必须开) - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] # 用创世区块启动 - ORDERER_GENERAL_BOOTSTRAPMETHOD=file - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/genesis.block volumes: - ./crypto/orderer/msp:/var/hyperledger/orderer/msp - ./crypto/orderer/tls:/var/hyperledger/orderer/tls - ./genesis.block:/var/hyperledger/orderer/genesis.block ports: - "7052:7050" - 启动新节点:
docker-compose -f docker-compose-orderer2.yaml up -d - 验证节点状态:
- 看日志有没有报错:
docker logs -f orderer2.example.com - 检查Raft集群状态(如果用的是Raft共识):日志里会显示节点加入集群,同步数据,最终成为follower/leader
- 发个测试交易,确认新节点能正常参与共识
- 看日志有没有报错:
必看注意事项
- 生产环境必须开启TLS,所有节点的证书要由同一个CA签发,不然节点之间连不上
- 配置更新必须满足通道的签名策略,比如需要Orderer组织管理员签名,不然提交会失败
- 新节点启动后,Raft共识会自动同步区块数据,不用手动复制
- 添加完节点后,一定要监控所有Orderer的状态,确保共识正常运行,比如看每个节点的日志,用Prometheus+Grafana监控指标
内容的提问来源于stack exchange,提问作者Rohit Khatri
相关产品推荐
相关产品推荐

