前言
不知不觉,研究生三年的时光即将告一段落,毕业在即。回想起当初学习的场景,那时候笔记本上记满了密密麻麻的笔记,如今想要扔掉却又舍不得。因此,我决定将当初刚入门区块链时的学习笔记分享出来。由于是跨考的,所以当时的我对区块链甚至是计算机都一窍不通,直接开始了学习之旅。因此,笔记中可能存在一些错误,仅供参考,切勿直接照搬。希望读者能够在阅读的过程中保持思考,同时,大体逻辑是可靠的。如果发现了任何错误,请务必告知我,我将及时进行修改。
10.1 CouchDB简介
CouchDB是面向文档的新型数据库管理系统,而不是传统的关系型数据库。CouchDB是一种 NoSQL的解决方案,以键值映射的方式存储文档字段。CouchDB是 Apache Software Foundation开源项目下的一个顶级项目,可以安装在Linux、Mac 0S X和Windows (x64)等操作系统上。
HyperLedger Fabric中使用CouchDB替代默认的LevelDB作为状态数据库(State Database),保存智能合约中操作的业务数据。当数据值建模为JSON时,除了支持LevelDB支持的keyed/composite-key/keyrange查询以外,还支持丰富的数据查询功能,如针对整个区块链数据的非键查询等。
CouchDB是可以通过RESTful API方式提供调用的键值数据库,通过http 请求操作数据库。
10.2 CouchDB 部署
HyperLedger Fabric 的默认数据库是LevelDB,它是Peer的本地数据库,与Peer是一对一的关系。当替换为CouchDB时,也需要每个Peer对应一个CouchDB 数据库。
1.镜像下载
在第4章Fabric基础环境搭建的镜像下载中已提供下载方式,如果未下载,可以直接执行如下命令完成下载。
docker pull hyperledger/fabric-couchdb:latest
下载完成,通过docker images命令查看是否安装成功,如果出现图10-1所示的结果,表示安装成功。
2.服务启动
服务启动可以通过两种方式,一种是命令行启动,另一种是Docker启动。
(1)命令行启动
CouchDB启动时需要指定一个本地文件夹用于CouchDB的数据存储,执行如下命令启动CouchDB。
cd $GOPATH/src/github.com/hyperledger/fabric/kafkapeer
mkdir mycouchdb
docker run -p 5984:5984 -d --name mycouchdb -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=123456 -v ~/couchdb:/opt/couchdb/data hyperledger/fabric-couchdb:latest
(2)Docker 启动(还未实验)
Docker启动需要修改Peer的yaml配置文件,加入CouchDB的启动配置项,并修改Peer的environment的参数,切换到CouchDB数据库,配置如下。
services:
couchdb:
container_name: couchdb
image: hyperledger/fabric-couchdb
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
# for example map it to utilize Fauxton User Interface in dev environments.
ports:
- "5984:5984"
peer0.org1.example.com:
container_name: peer0.org1.example.com
hostname: peer0.org1.example.com
image: hyperledger/fabric-peer
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
…
通过启动Peer服务,一并启动CouchDB,命令如下。
docker-compose -f docker-compose-peer.yaml up -d
3.Web管理
CouchDB按以上两种方式启动服务后,可以通过浏览器访问,进行数据库后台管理操作,访问地址为http://192.168.203.3:5984/_utils,CouchDB界面如图10-2所示。
图10-2 CouchDB界面
界面功能简介如表10-1所示。
表10-1 界面功能简介
10.3 CouchDB接口
CouchDB接口分为服务接口、数据库接口、文档接口和设计文档接口,本节简要介绍主要接口的调用方式,接口的详细介绍请访问CouchDB官方教程。
1.检查数据库是否已经安装和运行
运行如下命令检查数据库是否已经安装和运行
# curl http://192.168.203.3:5984/
返回结果如下。
{"couchdb":"Welcome","version":"2.1.1","features":["scheduler"],"vendor":{"name":"The Apache Software Foundation"}}
2.创建数据库
运行如下命令创建数据库。
# curl -X PUT http://admin:123456@192.168.203.3:5984/mydb
返回结果如下。
{"ok":true}
错误
{"error":"unauthorized","reason":"You are not a server admin."}
添加admin:123456
3.检查新建的数据库
运行如下命令检查新建的数据库。
# curl http://192.168.203.3:5984/mydb
返回结果如下。
{"db_name":"mydb","update_seq":"0-g1AAAAEzeJzLYWBg4MhgTmHgzcvPy09JdcjLz8gvLskBCjMlMiT J____PyuRAYeCJAUgmWSPX40DSE08fjUJIDX1eNXksQBJhgYgBVQ2n5C6BRB1-wmpOwBRd5-QugcQdSD3ZQEAiJJi9g","sizes":{"file":33920,"external":0,"active":0},"purge_seq":0,"other":{"data_size":0},"
doc_del_count":0,"doc_count":0,"disk_size":33920,"disk_format_version":6,"data_size":0,"compact_running":false,"cluster":{"q":8,"n":1,"w":1,"r":1},"instance_start_time":"0"}
4.添加文档
运行如下命令添加文档。
#
curl -H "Content-Type:application/json" -X POST http://192.168.203.3:5984/mydb -d'{"_id":"docid1","name":"docname"}'
返回结果如下。
{"ok":true,"id":"docid1","rev":"1-9615e15cc981ebfda6474d163523fdeb"}
5.读取文档
运行如下命令读取文档。
# curl http://192.168.203.3:5984/mydb/docid1
返回结果如下。
{"_id":"docid1","_rev":"1-9615e15cc981ebfda6474d163523fdeb","name":"docname"}
6.修改文档
运行如下命令修改文档。
# curl -X PUT http://192.168.203.3:5984/mydb/docid1 -d '{"_id":"docid1","_rev":"1-9615e15cc981ebfda6474d163523fdeb","name":"docname1","title":"title1"}'
返回结果如下。
{"ok":true,"id":"docid1","rev":"2-693b8762583b6bca27fcd0235de72186"}
7.删除文档
运行如下命令删除文档。
#
curl -X DELETE http://192.168.203.3:5984/mydb/docid1?rev=2-693b8762583b6bca27fcd0235de72186
返回结果如下。
{"ok":true,"id":"docid1","rev":"2-693b8762583b6bca27fcd0235de72186"}
8.查看所有文档
运行如下命令查看所有文档。
# curl http://192.168.203.3:5984/mydb/_all_docs
返回结果如下。
{"total_rows":1,"offset":0,"rows":[
{"id":"docid1","key":"docid1","value":{"rev":"2-693b8762583b6bca27fcd0235de72186"}}
]}
9.删除数据库
运行如下命令删除数据库。
# curl -X DELETE http://admin:123456@192.168.203.3:5984/mydb
返回结果如下。
{"ok":true}
10.4 CouchDB生产环境应用
在第8章Fabric Kafka生产环境部署的环境基础上,把Peer上的LevelDB数据库替换为CouchDB,在每个Peer的配置文件中做相应修改,即可切换为CouchDB数据库,配置以服务器192.168.235.7中的docker-compose-peer.yaml为例,其他服务器参照该yaml配置文件
修改后的docker-compose-peer.yaml(启动Peer服务配置文件)配置如下。
当创建通道、加入通道、执行智能合约后,Peer对应的CouchDB数据库中会生成mychannel_、mychannel_lscc和mychannel_mycc 3个数据库,界面如图10-3所示。
图10-3 CouchDB数据库
(1)mychannel_:保存通道相关的数据,界面如图10-4所示。
图10-4 CouchDB mychannel_
(2)mychannel_lscc:保存系统链码数据,界面如图
10-5所示。
图10-5 CouchDB mychannel_lscc
(3)mychannel_mycc:保存用户链码数据,生成a和b的键值对数据,界面如图10-6所示。
图10-6 CouchDB mychannel_mycc
10.5 本章小结
HyperLedger Fabric中数据库默认使用LevelDB作为状态数据库,本章主要介绍了如何使用CouchDB以替换LevelDB。
CouchDB是面向文档的数据库管理系统,而不是传统的关系型数据库。本章从
面向文档的新型数据库的基本概念开始,依次介绍了CouchDB部署和涉及的接
口,最后在第8章Fabric Kafka生产环境部署实例的基础上,替换Peer数据库,介绍了在生产环境中使用CouchDB进行配置和操作等知识