LevelDB是一个google实现的非常高效的kv数据库。它是一个c/c++编程语言的库,不包含网络服务封装,无法像一般的存储服务器(如MySQL)那样用客户端来连接它,使用者应该自己封装自己的网络服务器。
LevelDB是单进程的服务,能够支持billion级别的数据量,而且具有非常高的性能。写数据速度高达每秒过40W,随机读的性能就相对低一些。这是因为它的LSM存储引擎的设计思想:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘。
LevelDB的基本框架
Memtable:db数据在内存中的的存储形式,采用skiplist实现。
Sstable:数据持久化文件,其size有限制最大值,sstable采用分层管理。db预定了最大的层级数。Sstable前一部分是由一个个block组成,后面是索引元信息(封装成FileMetaData)。
Log:日志文件,主要作用是用于系统崩溃恢复而不丢失数据,levelDB在写入内存前先将操作记录写入Log文件中,然后再写入内存(memtable)中。
Manifest:清单文件,主要存储的是sstable中key开始和结束的区间,在读操作时可以定位要读取的key在哪个sstable。
写操作:
先将数据同步到Log,再写入memtable,写完成同时SnapShot(当写入不为空时);当memtable的size到达阀值,memtable就会形成immutable memtable(只读memtable),同时生成新的memtable,后台compact会将只读存储表dump成sstable。第一次dump形成level 0,往后依次形成level1、level2…。Level0和其他层是有可能重叠的,其他层之间互不重叠。删除、修改都是写操作,删除是做标记,修改是写入和原来key一样的value,在最后sstable合并的时候才进行物理上的删除和修改。
读操作:
读数据时先去内存的memtable和immutable memtable查找;如果没有找到,根据索引文件manifest判断要找的key在哪个sstable中,然后先去cache中查找,未找到则在磁盘找,磁盘找到的sstable调入到cache中。