fabric数据持久化教程

背景

fabric多机kafka部署完毕,但是每次容器销毁后,网络和数据就都不存在了。对于生产环境来说,这是无法接受的,所以就要考虑数据持久化的问题了。

方案

综合fabric官方教程(https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#a-note-on-data-persistence),思路如下:

  1. 在peer容器的配置文件中添加如下命令:
volumes:
 - /var/hyperledger/peer0:/var/hyperledger/production
  1. 在couch容器的配置中添加如下命令:
volumes:
 - /var/hyperledger/couchdb0:/opt/couchdb/data

注意:/var/hyperledger/peer*/var/hyperledger/couchdb*要在本地手动创建

执行./scripts/script.sh mychannel,结果发现peer和couch容器中的数据的确备份到了本地目录。将所有容器销毁重新启动(启动后不执行./scripts/script.sh mychannel),然后执行query和peer(此处我是使用sdk执行两种命令),结果发现query成功,但是invoke失败了。提示错误如下:

Need to retry because process failed = kafka server: The requested offset is outside the range of offsets maintained by the server for the given topic/partition.

执行docker logs orderer0.example.com打印orderer日志,发现如下错误:

The requested offset is outside the range of offsets maintained by the server for the given topic/partition.

在网上搜罗一番后,发现一篇博客中提到过fabric数据持久化(http://www.solutionscan.org/42524-docker)。问题主要是没有将kafka的相关数据备份到本地,故操作如下:

  1. 在kafka配置文件中添加如下命令:
     environment:
       - KAFKA_LOG.DIRS=/opt/kafka/kafka-logs
     volumes:
       - /var/hyperledger/kafka/kafka-logs:/opt/kafka/kafka-logs

注意:/var/hyperledger/kafka/kafka-logs目录要在本地先创建

然后将所有容器全部销毁,删除本地/var/hyperledger目录下的数据(我是将该目录全部删除,然后重新创建),启动所有容器,然后执行./scripts/script.sh mychannel(kafka数据之前没有备份,所以需要重头来过);执行invoke和query命令都正常。销毁并重启所有容器,不执行./scripts/script.sh mychannel,在sdk中执行query和invoke完全正常。
问题到此解决了,可喜可贺,可喜可贺!

推荐阅读更多精彩内容