区块链实例交易连接失败或连接超时
问题现象
区块链实例交易连接失败或连接超时。
排查思路
•排查项一:链码首次实例化后发起交易超时。
•排查项二:实例状态异常。
•排查项三:客户端所使用的fabric-SDK与区块链实例版本不匹配。
•排查项四:peer节点账本不同步。
•排查项五:DB文件不存在。
•排查项六:旧版本的CouchDB服务容器重启后,区块链实例不可用。
•排查项七:区块链应用客户端发起上链请求,返回请求超时,但数据可以上链
解决方案
- 排查项一:链码首次实例化后发起交易超时。
BCS实例3.0.x版本(对应Fabric v1.4.0内核)在实例化链码时,仅会拉起各组织其中一个Peer对应的链代码容器,而其余Peer的链代码构建和拉起将在该Peer首次进行交易背书时触发。该过程耗时较长,可能出现交易超时的情况:
图1 交易超时
如使用Go SDK进行区块链操作,则无需处理该问题,SDK会等待链码容器拉起,不会出现超时情况。
如使用Java SDK进行交易,为避免该问题,可在应用中使用req.setProposalWaitTime()设置背书超时时间。如下图所示,将背书超时时间设定为60秒,可避免一般链码在这种该情况下的首次交易失败问题。
图2 交易失败
- 排查项二:BCS实例状态异常。
登录BCS控制台,查看BCS实例状态,并根据状态提示进行排查解决。具体参考区块链实例状态为“异常”时,如何排查解决?。
- 排查项三:客户端所使用的fabric-SDK与区块链实例版本不匹配。
进入BCS控制台,单击“实例管理”,单击交易异常的实例名称,查看版本信息。
根据“版本信息”显示的Hyperledger Fabric版本,排查客户端所使用的fabric-sdk是否与其一致。如果版本不一致,会导致交易失败、交易超时等情况发生。
解决方案
根据实际的Hyperledger Fabric版本,下载对应的fabric-sdk包开发客户端。
Fabric源码包下载地址:https://github.com/hyperledger/fabric。
- 排查项四:peer节点账本不同步。
- 进入BCS控制台,单击“实例管理”,选择交易异常的实例,进入区块链管理页面,并单击“区块浏览器”,选择交易异常的通道,查看“区块列表”中显示的当前通道区块数。
图3 区块列表
- 登录部署BCS区块链的云服务器,并执行docker ps|grep k8s_peer指令查看peer容器,记录交易超时的peer节点容器ID。
图4 查看peer容器
- 执行docker exec -it {容器ID} bash进入容器。
图5 进入容器
- 执行peer channel list查看peer节点加入的通道。
图6 查看peer节点加入的通道
- 执行peer channel getinfo -c {通道名}查看peer节点账本落块情况。
图7 查看peer节点账本落块情况
如果peer节点账本落块数与区块链浏览器中查询结果存在差异,且10min后再次查询,该peer节点账本区块数一直未增长,则可能因为资源不足、并发过高导致peer节点落块不同步,造成交易状况异常。
- 若还是无法解决,请提工单咨询。在控制台页面右上角,选择“工单 > 新建工单”,进入新建工单页面,按照页面提示选择问题类型创建工单。
- 进入BCS控制台,单击“实例管理”,选择交易异常的实例,进入区块链管理页面,并单击“区块浏览器”,选择交易异常的通道,查看“区块列表”中显示的当前通道区块数。
- 排查项五: DB文件不存在。
- 登录部署BCS区块链的云服务器,并执行docker ps|grep k8s_peer指令查看peer容器,记录交易状况异常的peer节点容器ID。
图8 查看peer容器
- 执行docker exec -it {容器ID} bash进入容器。
图9 bash进入容器
- 执行cd /var/log/baas-service/peer/进入peer节点日志存储路径,执行ll查看所有文件。
图10 查看所有文件
- 获取Peer节点的哈希值及序号:
登录区块链管理页面,单击“区块浏览器”,在“Peer节点状态列表”的“Peer节点域名”列查看。
图11 Peer节点状态列表
- Peer节点日志命名规则为peer-{哈希值}-{序号}.trace,执行 cat {文件名}|grep -C 5 "Fail to recover DB: file does not exist"搜索异常信息。
如存在“Fail to recover DB: file does not exist”相关信息,表明peer节点DB文件不存在,会导致交易状况异常。
- 若还是无法解决,请提工单咨询。在控制台页面右上角,选择“工单 > 新建工单”,进入新建工单页面,按照页面提示选择问题类型创建工单。
- 登录部署BCS区块链的云服务器,并执行docker ps|grep k8s_peer指令查看peer容器,记录交易状况异常的peer节点容器ID。
- 排查项六:旧版本的CouchDB服务容器重启后,区块链实例不可用。
旧版本的CouchDB服务容器重启后,由于状态数据没有存入网盘中,所以重启后状态数据丢失,CouchDB重新加载区块数据生成状态数据,导致区块链实例在一段时间内不可用。
十五万的区块数同步数据耗时2小时左右,同步数据期间peer的7051端口不可访问。
解决方案:
- 将区块链实例升级至最新版本,后续再有版本升级或重启操作,将不会发生此类问题。
区块链实例首次升级至最新版本时,由于CouchDB容器挂载网盘并同步状态数据,会导致区块链实例一段时间无法交易,具体时间随账本区块数线性增加,每十五万的区块数同步数据耗时2小时左右,账本区块数可在“区块链管理”>“区块浏览器”页面查看。
- 登录区块链服务BCS控制台,在实例卡片中,单击“更多 > 更新版本”。
- 在弹出的窗口,可以查看当前实例版本,或者选择最新版本升级区块链实例。
- 更新版本期间会导致实例不可用,如果是联盟链还会影响到其他联盟参与方,请和联盟其他参与方达成共识后再操作,联盟所有成员都需要升级。
- 请不要在链码安装或实例化时进行升级操作。
- 支持社区Hyperledger Fabric 1.4到社区Hyperledger Fabric 2.2的跨大版本升级。如果是联盟链,请确保所有联盟成员组件升级到同一版本,否则无法正常交易。
- BCS版本4.x.x对应社区Hyperledger Fabric 2.2版本。
- 更新版本只支持低版本到高版本的更新,更新成功后不支持版本回滚,更新失败时才允许执行版本回滚操作。
- 将区块链实例升级至最新版本,后续再有版本升级或重启操作,将不会发生此类问题。
- 排查项七:区块链应用客户端发起上链请求,返回请求超时,但数据可以上链。
若检查发现客户端报错“request timed out or been cancelled”,组织节点日志报错“UTC is more than 15mos apart from current server time”,请确保客户端机器与组织节点机器的时间和时区保持一致。