如何持久化CouchDB数据及基于持久化数据重建Composer网络
在Hyperledger Composer场景下,用Docker卷挂载是实现CouchDB数据持久化最靠谱的方式——毕竟大部分Composer网络都是基于Docker部署的。我给你拆解下具体步骤:
创建专用Docker数据卷:先给CouchDB数据整个独立的存储卷,避免和其他容器数据混在一起。执行命令:
docker volume create couchdb_data这个卷由Docker统一管理,就算后续删除容器,数据也不会丢失。
启动CouchDB时挂载卷:启动CouchDB容器时,把刚才创建的卷挂载到容器内CouchDB存储数据的默认路径
/opt/couchdb/data,命令示例:docker run -d -p 5984:5984 -v couchdb_data:/opt/couchdb/data --name couchdb couchdb:latest如果你的Composer网络是用
docker-compose部署的,直接在yaml文件里配置卷挂载即可:services: couchdb: image: couchdb:3.1 volumes: - couchdb_data:/opt/couchdb/data ports: - "5984:5984" volumes: couchdb_data: external: true权限注意事项:要是你不用Docker卷,而是用本地目录挂载的话,得给目录设置正确的权限——CouchDB容器内部用的是
couchdb用户(UID=5984),所以执行:chown -R 5984:5984 ./your-local-couchdb-dir不然容器启动后会因为权限不足无法写入数据。
既然已经有了持久化的CouchDB数据,重建网络的核心就是复用已有的数据卷/目录,千万别把旧数据搞丢了。按下面的步骤来:
确认持久化数据还在:先检查下之前的Docker卷是否存在,执行
docker volume ls,看看有没有你之前创建的couchdb_data卷。如果是本地目录挂载,直接去目录里查看是否有数据文件即可。清理旧容器但保留数据:停止并删除旧的Composer网络相关容器,但千万别加
-v参数!不然连数据卷都会被一并删除。命令:docker-compose down要是没用
docker-compose,就手动删除容器:docker rm -f $(docker ps -aq --filter name=your-composer-containers)复用挂载配置启动CouchDB:用之前的
docker-compose.yaml或者启动命令,确保CouchDB服务依然挂载那个持久化卷。启动后可以访问http://localhost:5984/_all_dbs,看看能不能看到之前业务网络对应的数据库(一般以业务网络名称命名),能看到就说明数据没问题。重新启动Composer业务网络:部署业务网络的时候,别执行初始化新数据库的操作。比如用
composer network start命令时,不用额外指定创建新数据库的参数,直接启动:composer network start -c PeerAdmin@hlfv1 -n my-network -V 0.0.1 -A admin -S adminpw这里要注意,如果你的链码有更新,得先升级链码,但只要链码的数据结构和旧数据兼容(比如没删掉必填字段、没修改字段类型),旧数据就能正常被读取和使用。
内容的提问来源于stack exchange,提问作者T_murder

