fabric数据持久化

本文档介绍了在fabric多机kafka部署中遇到的数据丢失问题及其解决方案。为确保生产环境的数据安全,遵循fabric官方教程,通过修改peer和couch容器配置实现数据备份到本地。然而,仅备份peer和couch数据会导致invoke失败,因为缺少kafka数据的持久化。通过备份kafka的日志,并在本地创建相应目录,最终实现了完整的数据持久化,确保即使容器销毁,query和invoke操作也能正常进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

### Hyperledger Fabric Off-Chain Data Storage SDK Hyperledger Fabric 提供了一种机制来处理链上数据与链下数据之间的交互。为了支持大规模应用,有时需要将部分数据存储在链外以减少账本负担并提高性能。为此,Hyperledger 社区开发了多种工具和技术来实现这一目标。 #### 链下数据存储概述 链下数据存储指的是不在区块链网络本身内保存的数据。这些数据通常存放在外部数据库或其他形式的持久化存储中。通过这种方式可以显著降低交易成本和提升查询效率[^1]。 对于 Hyperledger Fabric 而言,官方并没有提供专门针对链下数据存储的 SDK 文档;然而,社区成员已经创建了一些解决方案用于管理这类场景下的数据流动: - **World State Database**: 使用 LevelDB 或 CouchDB 作为状态数据库,允许应用程序开发者定义哪些键值对应该被同步到链下存储。 - **External Chaincode Libraries (ECL)**: ECL 是一种扩展方式,它使得智能合约能够调用外部服务来进行复杂计算或访问大型文件等操作[^2]. 具体来说,在实际项目实施过程中可能会涉及到如下几个方面的工作: 1. 设计合理的架构模式确保安全性和一致性; 2. 编写自定义代码桥接 Fabric 和所选的链下存储系统; 3. 实现必要的接口以便于从链码内部发起请求读取/写入非链上的资源。 下面是一个简单的 Python 示例展示如何利用 REST API 进行链下数据的操作(假设存在这样一个API): ```python import requests def store_off_chain_data(data_id, payload): url = f"https://offchain-storage.example.com/api/v1/data/{data_id}" response = requests.post(url, json=payload) if response.status_code == 201: print(f"Data {data_id} stored successfully.") else: raise Exception("Failed to store data.") # Example Usage store_off_chain_data('doc_007', {"content": "Important document content"}) ``` 此段代码展示了向假定存在的链下存储服务发送 POST 请求的过程,其中包含了要保存的具体内容以及唯一标识符 `data_id`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值