Hyperledger Composer CouchDB无法在所有Peer节点间同步复制问题咨询
解决Hyperledger Composer网络中CouchDB数据未跨Peer复制的问题
我太懂你现在的懊恼了——明明把所有Peer都加到了composerchannel通道里,通过REST接口加完参与者,却只有couchdb1里能看到tutorial-network的数据库数据,其他Peer的CouchDB完全没同步上。别慌,咱们一步步排查,肯定能找到问题所在:
1. 先确认所有Peer真的成功加入了通道
有时候看起来加入了通道,实际可能因为网络或配置问题没成功。你可以在每个Peer所在的机器上跑命令检查:
- 在System1的Peer1、Peer2节点上执行:
看看输出里有没有peer channel listcomposerchannel; - 再去System2的Peer3节点上跑同样的命令,确认通道出现在列表里。
如果哪个Peer没显示这个通道,就得重新执行加入命令:
peer channel join -b composerchannel.block
记得提前把composerchannel.block文件同步到对应节点的机器上哦。
2. 检查链码的安装与实例化状态
Hyperledger Composer的业务逻辑全靠链码驱动,所有Peer都得装对应的tutorial-network链码才行(链码只需要在一个Peer上实例化,其他Peer会同步,但安装步骤不能少)。
- 分别在Peer1、Peer2、Peer3上检查链码安装情况:
输出里得能看到peer chaincode list --installedtutorial-network的链码包(包含名称、版本信息); - 如果某个Peer没装,就重新安装链码:
路径根据你实际的链码存放位置调整就行。peer chaincode install -n tutorial-network -v 0.0.1 -p github.com/hyperledger/composer-sample-networks/packages/tutorial-network
3. 验证Peer和对应CouchDB的连接是否正常
每个Peer都得正确关联自己的CouchDB,而且CouchDB服务得正常跑着:
- 打开每个Peer的
core.yaml配置文件,检查ledger.state.stateDatabase是不是设成了CouchDB,再确认ledger.state.couchDBConfig里的地址、用户名密码有没有正确指向对应的CouchDB实例; - 直接访问每个CouchDB的控制台(比如
http://<机器IP>:5984/_utils),看看服务能不能正常打开,有没有报错日志; - 查看Peer容器的日志,排查有没有连接CouchDB失败的报错:
比如System1上的Peer1容器可能叫docker logs <你的Peer容器名>peer1.org1.example.com,System2上的Peer3是peer3.org1.example.com,根据你实际的容器名改就行。
4. 检查通道的区块同步情况
数据复制本质就是区块同步,每个Peer得同步通道上的所有区块,才会更新自己的CouchDB状态。你可以对比每个Peer的区块高度:
- 在每个Peer上执行:
看看输出里的peer channel getinfo -c composerchannelBlockchain info: height值是不是一致,如果某个Peer的高度比别人低,说明区块同步出问题了。
区块同步异常常见原因有这些:
- 机器间网络不通:检查System1和System2之间的网络能不能互通,Peer3能不能访问Orderer和其他Peer的端口(默认的7051、7050这些端口有没有开放);
- Orderer服务异常:确认System1上的Orderer正常运行,日志里没报错;
- Gossip配置不对:检查Peer的
core.yaml里peer.gossip相关配置,确保bootstrap节点指向集群里的其他Peer(比如Peer3的bootstrap要设成Peer1或Peer2的地址),这样才能通过gossip协议同步区块。
5. 确认Composer的交易真的提交成功了
有时候不是没复制,是交易根本没提交到通道。你可以用Composer的CLI工具查交易状态:
composer transaction list -n tutorial-network -c admin@tutorial-network
看看你添加参与者的交易是不是显示SUCCESS状态。如果交易失败,那肯定不会同步到其他Peer。
另外,也可以在Peer的日志里搜索对应的交易ID,确认交易有没有被正确处理,并且广播到了通道的所有Peer。
内容的提问来源于stack exchange,提问作者Paresh Varde
相关产品推荐
相关产品推荐

