fabric数据持久化
背景
fabric多机kafka部署完毕,但是每次容器销毁后,网络和数据就都不存在了。对于生产环境来说,这是无法接受的,所以就要考虑数据持久化的问题了。
方案
综合fabric官方教程(https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#a-note-on-data-persistence),思路如下:
- 在peer容器的配置文件中添加如下命令:
volumes:
- /var/hyperledger/peer0:/var/hyperledger/production
- 在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的相关数据备份到本地,故操作如下:
- 在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完全正常。