Hyperledger Fabric更新锚节点报SERVICE_UNAVAILABLE错误如何解决
报错场景说明
运行锚节点更新的配置拉取命令时返回SERVICE_UNAVAILABLE:
peer channel fetch config config_block.pb -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -c mychannel
完整返回日志:
2021-07-26 12:42:59.856 UTC [cli.common] readBlock -> INFO 002 Expect block, but got status: &{SERVICE_UNAVAILABLE}
该错误在新增Raft排序节点后触发,删除额外排序节点后功能恢复,核心原因为Raft集群节点间无法完成正常集群通信,可按以下步骤排查修复:
- 验证configtx.yaml Consenters配置正确性
检查所有新增排序节点的Consenters配置项:确认host为节点可被集群内其他节点访问的正确域名/IP,port为集群通信端口(默认7051,不是对外服务的7050端口),server_tls_cert、client_tls_cert路径对应fabric-ca生成的对应节点TLS证书实际路径,没有出现路径填错、证书串用问题。 - 排查集群网络连通性
所有排序节点需处于同一网络,且互相可访问集群通信端口:Docker部署场景下确认所有orderer容器加入了同一个Docker网络,没有端口冲突;进入orderer容器执行ping <其他orderer节点域名>验证域名解析正常,执行telnet <其他orderer节点域名> 7051验证端口连通性,出现连接超时/拒绝的问题先修复网络配置。 - 校验集群TLS证书与启动配置一致性
所有排序节点需使用同一个创世块启动,禁止混用包含不同Consenters列表的创世块;检查每个orderer的环境变量:ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE、ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY、ORDERER_GENERAL_CLUSTER_ROOTCAS均指向正确的证书路径,所有节点TLS证书由同一个根CA签发,没有跨CA、证书过期问题。 - 确认排序节点添加流程符合规范
Raft集群新增节点不能直接修改configtx.yaml后直接启动新节点,需按流程操作:先更新系统通道配置将新节点信息加入Consenters列表,再启动新的排序节点同步区块,否则原有Raft集群会拒绝识别新节点,触发集群服务不可用报错。 - 通过orderer运行日志定位具体问题
提取orderer容器的运行日志,重点检索Raft、cluster相关的报错:出现TLS handshake failed优先排查证书配置,出现dial timeout优先排查网络连通性,出现unknown peer优先排查创世块与Consenters配置一致性。
内容的提问来源于stack exchange,提问作者Nikhil Agarwal
相关产品推荐
相关产品推荐

