LevelDB源码之旅--初探

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

文章被以下专栏收录