新增RAFT Orderer无法识别所属应用通道channel1问题排查
你遇到的问题本质是:新增的RAFT排序节点orderer0.org2.example.com在完成应用通道channel1的配置更新后,没有自动同步到通道的基础数据,导致它不知道需要服务这个通道。RAFT排序节点加入应用通道的逻辑和Peer节点完全不同,你刚好遗漏了触发新节点加载通道创世区块的关键步骤。
为什么手动复制文件夹能解决问题?
你手动把主排序节点的channel1文件夹复制到新节点,本质是让新节点直接获取了该通道的创世区块和历史区块数据。RAFT集群检测到新节点加入后,会自动同步后续的区块,所以节点能正常识别并服务channel1。但这种手动复制的方式在生产环境有数据不一致的风险,不是规范操作。
正确的完整流程(补充你遗漏的步骤)
在你完成channel1的前4步操作后,必须添加以下关键步骤:
步骤5:让新排序节点加载channel1的创世区块
- 先从主排序节点导出
channel1的创世区块:osnadmin channel fetch config channel1_genesis.block -o orderer0.org1.example.com:7050 \ --ca-file /path/to/org1/ca-cert.pem \ --client-cert /path/to/admin/org1-admin-cert.pem \ --client-key /path/to/admin/org1-admin-key.pem \ -c channel1 - 然后让新排序节点加载这个区块,加入
channel1的RAFT集群:osnadmin channel join -o orderer0.org2.example.com:7050 \ --ca-file /path/to/org2/ca-cert.pem \ --client-cert /path/to/admin/org2-admin-cert.pem \ --client-key /path/to/admin/org2-admin-key.pem \ -c channel1 \ --block ./channel1_genesis.block
原理说明
RAFT排序节点要服务某个通道,必须先拥有该通道的创世区块作为初始化基础。当你把新节点添加到channel1的Consenters列表后,主节点会尝试向新节点发送通道配置请求,但如果新节点没有创世区块,它无法处理这些请求,就会出现channel channel1 doesn't exist的错误。通过osnadmin channel join命令让新节点加载创世区块后,它才能加入到channel1的RAFT集群,自动同步后续的区块数据,正常提供服务。
执行完上述步骤后,你可以检查新节点的/var/hyperledger/production/orderer/chains目录,会自动生成channel1文件夹,同时主节点的Failed to send StepRequest错误会消失,新节点日志会显示区块同步的信息。
内容的提问来源于stack exchange,提问作者aldred

