RocksDB 介绍

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

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

  • B+ 树

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

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

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

  • LSM 树(Log-Structured Merge Tree)

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的整体结构:

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


附注:LSM树与B+树的比较:


一般来说,索引本身很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以决定索引性能的一个最重要指标就是在查找过程中磁盘I/O操作次数的渐进复杂度,换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。一般来讲,索引有如下几种数据结构:

1、B+树索引:mysql的默认索引类型,B+树的内结点只存储了key没有存储data,节点的出度大,树的高度小,查找的磁盘寻址次数就少,因此拥有不错的性能

2、hash索引:hash表的查找复杂度只有O(1),索引的检索可以一次定位,不像B+Tree 索引需要从根节点到枝节点,但不支持范围查找,另外在有大量重复键值或者数据量非常大的情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

3、FULLTEXT索引:全文索引,lucene、elasticsearch的默认索引类型,也叫反向索引、倒排索引,即根据关键字来找到文档

4、空间索引:mongodb和MySQL 5.7之后的版本都支持空间索引,用于对GIS数据类型的索引,比如根据自己所在位置查询来查询附近50米的POI(point of interest)

5、位图索引:位图索引是一种特殊的索引,适用范围比较小,只适用于字段值固定并且值的种类很少的情况,比如性别,只能有男和女,或者级别,状态等

6、LSM:Log Structured-Merge Tree,当前许多产品都在使用,比如HBase, Cassandra, LevelDB, SQLite。LSM通过消去随机的本地更新操作,把磁盘随机写操作变为顺序写操作,从而得到更好的写操作吞吐量。LSM树的设计思想非常朴素,将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘。文件是不可修改的,他们永远不会被更新,新的更新操作只会写到新的文件中。读操作会依次从最新的文件查找,通过周期性的合并这些文件来减少文件个数。所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。

综上,LSM索引相比哈希索引能够大幅提高写性能,数据量非常大的情况下因为哈希碰撞哈希索引的效率低。

转载自:各种索引的比较


你可能感兴趣的:(分布式)