欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

fabric数据持久化

程序员文章站 2022-07-14 16:05:33
...

背景

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完全正常。

相关标签: fabric