目标
- 记录fabric 由默认leveldb切换到couchdb(目前fabric仅支持将stateLeveldb切换到couchdb)。
- 观察数据变化
hyperledger fabric leveldb
- 默认就是leveldb,速度非常快。
hyperledger fabric couchdb
- 备用DB,couchdb更倾向于做数据管理:
- 利用Design documents做高级查询(具体可以看couchdb特性)
- UI管理
- MVCC
- REST
- 水平扩展性(fabric 每一个peer都需要部署一个statedb,fabric通过orderer deliver同步数据而不是复制)
- 离线支持(fabric 没什么用处,主要是对移动端数据迁移)
couchdb View 例子
{
“_id”: “CAR0”,
“_rev”: “1-f7f0dfb1560812b3f92d18c2dcd053ef”,
“colour”: “blue”,
“make”: “Toyota”,
“model”: “Prius”,
“owner”: “Tomoko”,
“~version”: “CgMBAwA=”
}
function (doc) {
if(doc.make == 'CAR0'){
emit(doc._id, doc);
}
}
环境搭建
参考 debug fabric https://blog.csdn.net/kk3909/article/details/104927333
hyperledger fabric leveldb 切换 couchdb
1、启动couchdb并设置好密码
2、修改peer配置文件(core.yaml)
3、启动orderer
4、启动peer,观察couchdb变化(http://127.0.0.1:5984/utils/#)
当fabric切换到couchdb时,只是把原先的stateLevelDB数据分成多个库存在couchdb中,具体如下
fabric__internal (记录fabric版本信息)
myc (通道)
myc__lifecycle(通道周期,用于管理chaincode)
myc__lifecycleKaTeX parse error: Got function '$' with no arguments as subscript at position 16: h_implicit_org_$̲sample$org(组织信息…p_implicit_org_
s
a
m
p
l
e
sample
sampleorg(组织信息(channel中包含一个或多个org;org中包含一个或多个peer。))
myc_fabcar(交易的数据)
myc_lscc(用于创建及初始化channel上的chaincode
lscc负责管理链码的生命周期)
备注:
-
couchdb 源码
github.com\hyperledger\fabric\core\ledger\kvledger\txmgmt\statedb\statecouchdb -
leveldb 源码 github.com\hyperledger\fabric\core\ledger\kvledger\txmgmt\statedb\stateleveldb
-
在couchdb中其实是没有kv的概念,但是在leveldb中都是以kv形式存储,这里的key是不是一样的,couchdb中存的是json(也有一个id类似key),他的id是这样CHANNEL_CONFIG_ENV_BYTES,但是在leveldb中是myc d CHANNEL_CONFIG_ENV_BYTES,这是因为在leveldb中所有信息都存在里面如果有多个channl的时候无法区分,但是在所以需要在key前面加了myc前缀(通道名称),但是在couchdb中已以数据库的方式做了区分,所以只需要存CHANNEL_CONFIG_ENV_BYTES即可;这种情况在fabric中很常见;理论上couchdb中的值都是可以在leveldb中找到的,但是可能存在不同的形式,比如组织信息,leveldb中展示
在couchdb中就是这样的
-
fabric中的leveldb自己做了封装(leveldb中本身就有LOOK的机制,这里的mutex sync.RWMutex意义是什么?)