rocksdb引擎简析

rocksdb研究1--rocksdb引擎简析

  • rocksdb简介
    • leveldb 构架
    • rockdb构架
    • rocksdb 所做的主要优化
    • 写流程
      • FLUSH
      • COMPACTION
    • 读流程

rocksdb简介

Rocksdb是facebook开源的key-value存储系统,其设计是基于Google开源的Leveldb,因此应用了LSM (Long Structure Merge Tree)策略。

leveldb 构架

rocksdb引擎简析_第1张图片
从图中可以看出,构成LevelDb静态结构的包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。

当应用写入一条Key:Value记录的时候,LevelDb会先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这是为何说LevelDb写入速度极快的主要原因。

Log文件在系统中的作用主要用于系统崩溃时恢复数据。当系统崩溃时,如果内存中的数据还没有来得及Dump到磁盘,可以从Log文件的记录恢复内存中的Memtable。

当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件中,LevleDb会生成新的Log文件和Memtable,原先的Memtable就成为Immutable Memtable,顾名思义,就是说这个Memtable的内容是不可更改的,只能读不能写入或者删除。新到来的数据被记入新的Log文件和Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。

rockdb构架

rocksdb引擎简析_第2张图片

上图就是Rocksdb的基础架构。Rocksdb中引入了ColumnFamily(列族, CF)的概念,所谓列族也就是一系列kv组成的数据集。所有的读写操作都需要先指定列族。写操作先写WAL,再写memtable,memtable达到一定阈值后切换为Immutable Memtable,只能读不能写。后台Flush线程负责按照时间顺序将Immu Memtable刷盘,生成level0层的有序文件(SST)。后台合并线程负责将上层的SST合并生成下层的SST。Manifest负责记录系统某个时刻SST文件的视图,Current文件记录当前最新的Manifest文件名。 每个ColumnFamily有自己的Memtable, SST文件,所有ColumnFamily共享WAL、Current、Manifest文件。

rocksdb 所做的主要优化

  1. 增加了column family,有了列簇的概念,可把一些相关的key存储在一起
  2. 可支持多线程同时compation,理论上多线程同时comaption会比一个线程compation要快
  3. 增加了merge operator,也就是原地更新,优化了modify的效率
  4. 支持DB级的TTL
  5. flush与compation分开不同的线程池来调度,并具有不同的优先级,flush要优于compation,这样可以加快flush,防止stall
  6. 对SSD存储做了优化,可以以in-memory方式运行
  7. 增加了对 write ahead log(WAL)的管理机制,更方便管理

写流程

rocksdb写入时,直接以append方式写到log文件以及memtable,随即返回,因此非常快速。
memtable/immute memtable触发阈值后, flush 到Level0 SST;
Level0 SST触发阈值后,经合并操作(compaction)生成level 1 SST; level1 SST 合并操作生成level 2 SST,以此类推,生成level n SST.

FLUSH

Memtable/immute memtable --> level0 SST
每一个的column family分别有一个memtable与sstablle. 当某一coloumn family内存中的memory table超过阈值时,转换成immute memtable并创建新的memtable,immute memtable由一系列的memtable组成,它们是只读的,可供查询,不能更新数据。当immute memtable的数目超过设置的数值时,会触发flush,DB会调度后台线程将多个memtable合并后再dump到磁盘生成Level0中一个新的sstable文件。

COMPACTION

Level 0 SST --> Level 1 SST -->… -->Level n SST
Level0中的sstable文件不断累积,会触发compaction,DB会调度后台compaction线程将Level0中的sstable文件根据key与Level1中的sstable合并并生成新的sstable,依次类推,根据key的空间从低层往上compact,最终形成了一层层的结构,层级数目是由用户设置的。
:Level0 SST文件中 可能有重复的key,Level1及以上level SST 中的key是唯一的。这是因为flush操作时,没有和其他SST文件作去重处理;而compaction时,与上级SST文件有作merge操作

读流程

按照 memtable --> Level 0 SST–> Level 1 SST --> … -> Level n SST的顺序读取数据。
这和记录的新旧顺序是一致的。因此只要在当前级别找到记录,就可以返回。

查找SST文件时,如果SST文件不在缓存中,通常并不需要把整个SST文件读入内存。因为每个SST都有一个布隆过滤器,通过它可以快速判断一个key不在SST中,从而节约大量的I/O操作。
注意 在LEVEL 0 SST文件中,因同一key可能会出现在多个文件中,需要找出所有记录,再按时间顺序取最后的记录。

你可能感兴趣的:(rocksdb引擎简析)