fabric資料持久化

王一洋發表於2019-03-08

背景

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

相關文章