RocksDB 介绍

来源:互联网 发布:云计算是什么意思啊 编辑:程序博客网 时间:2024/06/08 03:47

RocksDB相对传统的关系数据库的一大改进是采用LSM树存储引擎。LSM树是非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。

RocksDB相对传统的关系数据库的一大改进是采用LSM树存储引擎。LSM树是非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。

  • B+ 树

image001

上图是B+树的一个例子。 B+树根节点和枝节点分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。叶子节点里每个键值都指向真正的数据块,每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和跟节点。

B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。

对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 … 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO,低下的磁盘寻道速度严重影响性能。

  • LSM 树(Log-Structured Merge Tree)

image003

LSM树而且通过批量存储技术规避磁盘随机写入问题。 LSM树的设计思想非常朴素, 它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。

  • LevelDB 特点

1) LevelDB是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDB不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。

2) LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数。

3) LevelDB支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。

4) LevelDB还支持数据压缩等操作,这对于减小存储空间以及增快IO效率都有直接的帮助。

  • RocksDB 对LevelDB的优化

1) 增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同column family的数据是存储在不同的sst和memtable中,所以一定程度上起到了隔离的作用。

2) 采用了多线程同时进行compaction的方法,优化了compact的速度。

3) 增加了merge operator,优化了modify的效率。

4) 将flush和compaction分开不同的线程池,能有效的加快flush,防止stall。

5) 增加了对write ahead log(WAL)的特殊管理机制,这样就能方便管理WAL文件,因为WAL是binlog文件。

RocksDB的整体结构:

image005

rocksdb从3.0开始支持ColumnFamily的概念。每个columnfamilyl的meltable与sstable都是分开的,所以每一个column family都可以单独配置,所有column family共用同一个WA文件,可以保证跨column family写入时的原子性。


原创粉丝点击