以太坊的存储层技术分析之一:存储层及LevelDB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxid2798226/article/details/83689507

LevelDB数据库技术是以太坊所采用的存储层技术。从架构设计上来说,区块链可以简单的分为三个层次,从上到下分别是应用层、扩展层和协议层。其中,协议层又可以分为网络层和存储层,它们相互独立但又不可分割(图1)。

存储层是区块链技术中重要的技术环节,也是最底层的技术环节。区块链节点启动时,需要从保存在磁盘上的数据库中读取以往区块,为区块同步做准备;区块链应用各节点达成共识后,要写入数据库,方能将共识固化下来;存储层的性能容量对区块链整体性能容量有重大影响。
 

LevelDB本身是集成到以太坊的,为了更好地研究,有必要单独拿出LevelDB进行体验,掌握其整体架构,为研究其和以太坊的对接做准备。

安装命令:

go get github.com/syndtr/goleveldb/leveldb

调用代码实例:

// The returned DB instance is safe for concurrent use. Which mean that all

// DB's methods may be called concurrently from multiple goroutine.

db, err := leveldb.OpenFile("path/to/db", nil)  //打开数据库并获得链接

...

defer db.Close()   

{  //如下是打开数据库后的使用,主要就3个,put,get,delete

        db.Put([]byte("key"), []byte("value"), nil)

        data, err := db.Get([]byte("key"), nil)

        if err == nil {

                fmt.Println("get successful!!", data)

        }

}

生成的空数据库包括如下文件(ldb文件要等到实际有数据了才有):

图1 LevelDB初始化后的数据库文件列表              

如上文件作用的介绍:

000001.log是当前的数据库交易的预写日志。key -value内容先写在这个文件中,然后才写入内存表,当数据库宕机时,会从这个log文件读取并进行恢复。该文件是二进制格式(详见图2)

CURRENT是一个指针,指向最后一个数据库文件(这种顺序读写最后一个的特性和区块链的非常契合)

LOCK是锁定了当前数据库的标志文件

LOG是全局日志,供维护人员参阅

MANIFEST-[0-9]+ // 描述文件。只有CURRENT指向的当前文件才是有效的

db/[0-9]+.ldb // dbtable文件,后台进程会周期性将陈旧的内容写入ldb文件


图2:log文件格式,key和value之间是分隔符

以上是LevelDB存储的数据在磁盘上的体现,但其实LevelDB对数据的操作主要是在内存中进行的,磁盘上文件更像是事前的日志和事后的快照。当LevelDB运行了一段时间,此时我们给LevelDB进行透视拍照,那么您会看到如下一番景象:

图3 LevelDB存储结构

当应用写入时,具体过程如下,经历了从磁盘到内存,再到磁盘的过程:

1)LevelDB会先往磁盘log文件里写入,成功后将记录插进内存Memtable中,这样就算完成了写入操作。因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这是为何说LevelDB写入速度极快的主要原因。磁盘log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据,假如没有log文件,因为写入的记录刚开始是保存在内存中的,此时若系统崩溃,内存中的数据还没有来得及Dump到磁盘,所以会丢失数据。

2)当内存Memtable插入的数据占用内存到了一个界限后,LevleDB会生成新的Memtable,原先的Memtable就成为Immutable Memtable(还是在内存中),这个Immutable Memtable的内容是不可更改的,只能读不能写入或者删除。后台调度会将Immutable Memtable的数据异步导出到磁盘,形成一个新的SSTable文件。

3)磁盘上SSTable就是由内存中的数据不断导出并进行压缩操作后形成 的,而且SSTable的所有文件是一种层级结构,第一层为Level0,第二层为Level1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。SSTable中的文件是Key有序的,就是说在文件中小key记录排在大Key记录之前。

LevelDB的这种内存和磁盘分层存储模式,对以太坊编码实现是有重大影响的。

猜你喜欢

转载自blog.csdn.net/wxid2798226/article/details/83689507