Hyperledger fabric peer数据膨胀解决方案探讨

Zealot
区块链
2019-02-28

1. 问题场景

Fabric peer节点使用文件保存区块, 使用level db或couchdb数据库保存状态, 数据很多state db会膨胀, 我们探讨下一些解决方案。

2. couchdb集群

couchdb2.x支持集群, 分片, 应该能把数据分散到集群的其它节点。先简单过一下如何安装。

2.1 couchdb集群搭建

Fabric用到的couchdb镜像是自己打包的, 1.4对应的是hyperledger/fabric-couchdb:0.4.14, 不过很悲催, 笔者测试官方这个版本是有不少问题的:
(1)开启couchdb持久化, 启动直接报错; 不开启持久化可跳过

    volumes:
      - ./couchdb1/data:/opt/couchdb/data
Could not open file ./data/_users.couch: permission denied

(2)参考couchdb2.2, 2.3官方文档, docker hub couchdb镜像的安装文档, 三个节点可以复制, 但是每个节点的状态是 single_node_enable, 而换成docker hub couchdb镜像则直接成功。笔者已将把问题提交到官方JIRA https://jira.hyperledger.org/browse/FABB-118 不知道会有人跟进不。

搭建代码分享在https://github.com/zealzeng/fabric-couchdb-cluster-demo
docker启动couchdb算简单, 不过参数有点多, 最少需要三个节点, 我们参考docker-compose-couchdb1.yaml

#
# Copyright IBM Corp All Rights Reserved
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'

networks:
  basic:

services:
  couchdb1:
    container_name: couchdb
    #image: hyperledger/fabric-couchdb:0.4.14
    image: couchdb:2.2.0
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER=admin
      - COUCHDB_PASSWORD=adminpwd
      - NODENAME=192.168.31.86
      - ERL_FLAGS=-setcookie "brumbrum" -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9100
      - COUCHDB_SECRET=1234567890
    ports:
      - 5984:5984
      #- 5986:5986
      - 4369:4369
      - 9100:9100
    volumes:
      - ./couchdb1/data:/opt/couchdb/data
    #  - ./couchdb1/etc/local.ini:/opt/couchdb/etc/local.ini
    #  - ./couchdb1/etc/vm.args:/opt/couchdb/etc/vm.args
    #networks:
    #  - basic

必须使用低版本些couchdb:2.2.0, 实际上fabric-couchdb:0.4.14用的是2.2版本的couchdb, 2.3.0已测试过, 无法启动。
NODENAME一般用IP或完整域名, 实际生成的节点唯一名字为couchdb@NODENAME.

ERL_FLAGS实际是couchdb启动参数, 会对应生成一个ini文件, setcookie也是一个通信密钥, 到官方文档查下https://docs.couchdb.org/en/2.2.0/cluster/setup.html?highlight=cluster.

端口5984是一个Couchdb Fauxton工具或http api端口, 要保证fabric peer能采访。
端口5986是内部管理任务的端口, 可不开放。
端口4369是erlang epmd机制的通信端口, 好像是要节点之间相互采访, 通过setcookie保证安全。
端口9100用于集群内节点通信, 说是随机生成, 只能限制端口范围, 不开放集群好像就起不来。

安装步骤

(1)启动三个couchdb节点
192.168.31.86执行step1-start-couchdb1.sh
192.168.31.168执行step1-start-couchdb2.sh
192.168.31.121执行step1-start-couchdb1.sh

(2)选择一个操作节点192.168.31.86
假设ssh登录86, 默认使用127.0.0.1, 也可以使用86采访

curl -X POST -H "Content-Type: application/json" http://admin:adminpwd@127.0.0.1:5984/_cluster_setup -d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "admin", "password":"adminpwd", "port": 5984, "node_count": "3", "remote_node": "192.168.31.168", "remote_current_user": "admin", "remote_current_password": "adminpwd" }'
curl -X POST -H "Content-Type: application/json" http://admin:adminpwd@127.0.0.1:5984/_cluster_setup -d '{"action": "add_node", "host":"192.168.31.168", "port": 5984, "username": "admin", "password":"adminpwd"}'
curl -X POST -H "Content-Type: application/json" http://admin:adminpwd@127.0.0.1:5984/_cluster_setup -d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "admin", "password":"adminpwd", "port": 5984, "node_count": "3", "remote_node": "192.168.31.121", "remote_current_user": "admin", "remote_current_password": "adminpwd" }'
curl -X POST -H "Content-Type: application/json" http://admin:adminpwd@127.0.0.1:5984/_cluster_setup -d '{"action": "add_node", "host":"192.168.31.121", "port": 5984, "username": "admin", "password":"adminpwd"}'
curl -X POST -H "Content-Type: application/json" http://admin:adminpwd@127.0.0.1:5984/_cluster_setup -d '{"action": "finish_cluster"}'

要确保86能够采访168, 121其它两个节点, 防火墙之类要保证通信。
最后验证一下集群安装.

curl http://admin:adminpwd@127.0.0.1:5984/_cluster_setup

返回内容要保证是cluster_finished,如果是single_node_enabled, single_node_disabled多数要重来。
{“state”:”cluster_finished”}

(3)测试下集群
http://192.168.31.86:5984/_utils/
http://192.168.31.168:5984/_utils/
http://192.168.31.121:5984/_utils/

登录fauxton, 在一个节点创建或更新文档或数据, 在其它节点能够看到变化数据就对了。 一个节点停止后, 其它节点应该也能采访。

2.2 peer连接couchdb

参考docker-compose.yaml, 假设启动一个peer节点。

      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      #- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=192.168.31.86:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpwd

默认只能接入一个couchdb节点。couchdb貌似是提倡前置一个均衡负载HAPROXY或NGINX。
执行step2-start-fabric.sh就可以启动了。

登录cli可查询下, 也可以到fauxton查询下, 数据都是同步的。
peer chaincode query -C mychannel -n fabcar -c ‘{“Args”:[“queryAllCars”]}’

一些链码更新操作的同步测试这里就跳过了。

2.3 小结

couchdb的集群, 复制, 分片是否默认真的解决我们的问题 这里需要进一步研究下couchdb。但一个原则是如果能保证不是所有数据都放要给couchdb节点就好, 如果单纯只是每个节点都保存所有数据, 每个节点只是复制备份这样就没撒用了。 分片参考下
https://docs.couchdb.org/en/2.2.0/cluster/sharding.html?highlight=shard

3.使用网络存储

每个peer节点对应一个couchdb, couchdb使用网络存储NFS, NAS等扩容, fabric原本也是分布式记账本, 怕一个peer节点挂, 就多建两个peer冗余就好。

现在有不少区块链分片的实现, 闪电网络,侧链,迅雷的同构多链出现,实际上也是各玩各的,没有一个标准,fabric的路还长。

点赞 1
0条评论
其他心得
Zealot · 212天前 
1.简介 Fabric CA基于开源项目CFSSL开发, 主要为fabric网络提供PKI证书服务,是MSP生成的基础。可能有人会问, 官方不是有cryptogen工具批量生成MSP吗? cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书, 如果想简单来而区块链组织,节点和用户基本不会变, cryptogen也没问题。 2.
Zealot · 109天前 
去年得知蚂蚁金服放出SOFA的部分开源项目, RPC部分号称源于阿里内部的HSF, HSF当年可是把dubbo 1.x踢出局的, 只是没想到京东改造dubbo为JSF, 当当改为dubbox。国内蛮多电商公司实施服务化就直接上dubbo 1.x或dubbox。这应该是阿里没想到的, 所以现在dubbo 2.x又回笼为apache的顶级项目, 把dubbox合并还继续完善。 朋友说他们公司花了千万买了SOFA的商业版, 那么值钱的东西今天抽空过了一下开源部分的SOFAStack和dubbo2.x文档
Zealot · 118天前 
Fabric 1.4.1引入Raft排序服务, 运维界比较出名的etcd实现的orderer服务。后生可畏, etcd是中国一个年轻人的作品, 实现了raft协议, 在k8s等容器化, 虚拟化, 集群化有官方应用。etcd也是go语言编写, fabric开窍了, 直接把etcd和orderer整合了, 相比kafka/zookeeper的排序服务,搭建简单多了,也比kafka这些省了很多资源(kafka默认开的堆是2GB..), 所以个人是强烈推荐使用,尽量出来不久,但在1.4LTS维护,
Luoying web framework Luoying web framework contains a bundle of components to accelerate J2EE development Github地址 https://github.com/zealzeng/luoying-web Maven地址 <dependency> <groupId>com.whlylc</groupId> <artifac
Zealot · 126天前 
Hyperledger Fabric v2.0 Alpha引入两大新功能,新的Fabric链码生命周期和FabToken. 新的链码生命周期 2.0支持链码的去中心化的治理,引入新的流程在节点上安装链码,在通道上启动实例。新的链码生命周期允许多个组织对链码的参数协同达成一致,例如链码的背书策略。新的模型的改进点如下: (1) 多个组织必须确认同意链码的参数 1.x版本里,一个组织拥有修改链码参数的能力,例如修改背书策略,通道的其它成员也被同步而更改。新的链码生命周期更灵活一些,它兼容支