源自于NEO的KeyValue 数据库面世啦

栏目: 数据库 · 发布时间: 6年前

内容简介:虽然想把标题取得大一点,但终究不是什么太大不了的工作,还是安分守己的开始介绍吧。这个项目叫做LightDB由三个部分构成

虽然想把标题取得大一点,但终究不是什么太大不了的工作,还是安分守己的开始介绍吧。

项目组成

这个项目叫做LightDB

由三个部分构成

Lightdb.lib 是对rocksdb做了一层封装,主要的修改是追加了保存的数据类型,和表的概念

https://github.com/lightszero/lightdb.lib

Lightdb.server 就是一个远程数据库啦,Lightdb的服务器版本

https://github.com/lightszero/lightdb.server

Lightdb.SDK 是方便客户端接入LightdbServer 提供的,目前只提供了C#版本实现,后续还会提供Typescript版本实现,通讯协议比较简单,任意支持websocket的方案都可以连接。

https://github.com/lightszero/lightdb.sdk

项目特点

要说项目特点的话,

一、追加了数据类型和表概念。

二、有服务器,采用websocket通讯,对js友好

三、数据的存储以taskblock为单位,方便数据库互相验证和同步

其实最重要的特点还有一个关于读的快照snapshot。快照的需求来源是数据处理的事务化,或者说一批操作的原子性要求。

传统数据库一定程度支持事务化,而KeyValue数据库这边支持事务化的程度就更差一些。

而NEO使用的嵌入式数据库,LevelDB因为采用LSM存储方式,提供读取的snapshot 非常容易,代价也小。

这也就造成了在NEO的实现中,存储部分对Snapshot的依赖非常强。

创立这个项目的初衷,有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript

也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。

完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。

所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。

那么为什么要追加数据类型和表的概念?因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。

我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。

这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)

至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。

我们只是把这个分字典的自然需求,在数据库层面直接提供了。

然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。

当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。

比如nep5资产的blanceof,比如交易UTXO数据的确认。

其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.

后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧

为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。

对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥

最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。

不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的

项目使用方法

一、开服务器

获取lightdb.server,生成

启动之前看一下config

源自于NEO的KeyValue 数据库面世啦

Server_port 服务端口

Server_storage_path 数据库存储路径

Server_type 读写分离用,从机模式还没开发呢,只能Master

Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行

会写入库中,数据库创建之后,改这个值就没意义了

Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。

会写入库中,数据库创建之后,改这个值就没意义了

然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明

https://github.com/facebook/rocksdb/blob/master/INSTALL.md

中的Supported platforms一节

源自于NEO的KeyValue 数据库面世啦

源自于NEO的KeyValue 数据库面世啦

如果路径里没有创建过数据库会新建,否则会打开

源自于NEO的KeyValue 数据库面世啦

控制台目前只有db.state 和 db.block 两个功能

源自于NEO的KeyValue 数据库面世啦

Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型

二、客户端使用

首先引用lightdb.sdk,可以下源码,可以nuget

源自于NEO的KeyValue 数据库面世啦

New一个client对象

源自于NEO的KeyValue 数据库面世啦

注册,断线事件,然后Connect

如果连接成功,就OK

不需要登陆啥的,读随便,写的时候,需要你先签好名

Ping 与dbstate

源自于NEO的KeyValue 数据库面世啦

所有的读操作都是通过snap来进行的

源自于NEO的KeyValue 数据库面世啦

所以先要获取一个snapshot

然后就可以getblock

源自于NEO的KeyValue 数据库面世啦

Getblockhash

源自于NEO的KeyValue 数据库面世啦

Getvalue

client.Post_snapshot_getvalue(snapshotid, tableid, key);

要写数据就比较复杂了

源自于NEO的KeyValue 数据库面世啦

首先创建个writetask对象,所有的写入,都通过writetask对象完成,

然后创建signdata对象,进行签名

然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java高并发编程详解

Java高并发编程详解

汪文君 / 机械工业出版社 / 2018-6 / 89.00元

本书共分为四个部分:部分详细地介绍了Java多线程的基本用法和各个API的使用,并且着重介绍了线程与Java虚拟机内存之间的关系。第二部分由线程上下文类加载器方法引入,介绍为什么在线程中要有上下文类加载器的方法函数,从而掌握类在JVM的加载和初始化的整个过程。第三部分主要围绕着volatile关键字展开,在该部分中我们将会了解到现代CPU的架构以及Java的内存模型(JMM)。后一部分,主要站在架......一起来看看 《Java高并发编程详解》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试