LevelDB源码之旅--初探
LevelDB
LevelDB一个存储系统,数据保存在内存和磁盘中,这也是相较于redis的一个特点。其由谷歌实现,能支持billion级数据量的kv数据库引擎。同时,LevelDB代码约有5000行,使用C++编写,非常适合学习kv数据库及相关组件。
LevelDB为非关系型数据库,不能使用SQL语句查询。LevelDB提供了kv数据库操作的相关接口,但没有相应的客户端,需要用户自己封装。
如果要将LevelDB作为关系型数据库,可以在上层实现客户端模块,网络模块,SQL优化模块等,将 数据库表映射到kv值形式保存 。
-
LevelDB的key,value支持任意的byte类型数组,不单支持字符串。
-
LevelDB使用LSM tree,非常适合随机写。
-
LevelDB内部按照key的字典顺序存储,可以重载内置排序函数,支持迭代器遍历数据。
-
支持Snapshot(数据快照),使得读操作不受写操作影响,读取时始终得到一致的数据。
-
支持Snappy(数据压缩),有效减少存储空间。
-
支持批量操作以原子的进行。
整体架构
- MemTable。新的数据会首先写入这里,其为内存数据结构,与磁盘无关,读写速度非常快,实现了高效的写操作。LevelDB的跳表在此实现。
- Immutable MemTable。当MemTable达到容量上线后,变为Immutable MemTable,准备被归并入LSM树中。Immutable MemTable不再接受用户写入,同时生成新的MemTable向外提供服务。
- Log。数据写入MemTable前先写入日志(WAL),防止宕机导致数据丢失。
- Manifest。该文件记录SSTable在各层的信息,包括每一层有哪些SSTable,每个SSTable的大小,Key值的范围,即一些元信息。下一次启动可以通过manifest恢复原有内存中的数据。
- Current。系统中存在多个Manifest文件,通过Current文件找到当前的Manifest。
- SSTable。LevelDB存储结构分为多层,每一层包含若干个SSTables。SSTable文件内数据有序,每一层之间的Key值不相交。LSM树的结构会在特定条件下merge不同层的SSTable。
- TableCache。用于缓存SSTable的文件描述符,索引等。类似于文件系统对inode缓存。
- BlockCache。Block用于组织SSTable内的数据,持久化数据的基本单位。BlockCache用于缓存block数据。
发布于 2020-12-30 13:20