高性能存储引擎RocksDB总体概览

前言


笔者最近在学习一个第三方高效K-V存储系统RocksDB,相比较于其它类似成熟的存储系统而言,其中有很多共同之处,不过也有其独到设计之处。本文是笔者结合RocksDB GitHub上的wiki页进行的一个汇总整理,也顺当是帮助大家对RocksDB内部的整体模块设计有一个快速的了解。

RocksDB的整体模块


RocksDB作为一个可嵌入式的持久化存储系统,它是一个单点高性能的存储DB,不是我们平常我们说的分布式存储系统。RocksDB能支持非常高吞吐量的IO读写,可以很好地作为大型分布式存储系统元数据的存储媒介,比如Hadoop Ozone就将其元数据使用RocksDB作为元数据的结果写出。

RocksDB有和其它分布式存储系统类似的术语操作定义,比如WAL(Write-Ahead-Log),Transaction,Compact,Snapshot等等。不同点在于分布式存储系统需要依赖服务间的RPC通信做WAL的操作,而RocksDB没有RPC的概念。所以RocksDB本质上来说它是一个可插拔式的存储引擎选择。

以下是笔者整理出的RocksDB的整体架构预览图:

在这里插入图片描述

在上图中,总共将RocksDB分成了5大子模块,分别为:

  • Basic Operation,基本操作定义
  • Terminology,内部术语定义
  • Tool,内部工具
  • Logging/Monitoring ,日志和监控
  • System Behavior,内部系统行为

本文内容篇幅有限,下面我们只对上述部分模块进行解读。

RocksDB内部模块解读


此节我们对上图中的部分模块进行解读。

Terminology


首先是RocksDB内部的相关术语定义说明,如上图所示,主要有以下一些术语:

  • Write-Ahead-Log File,类似于HDFS JournalNode中的editlog,用于记录那些未被成功提交的数据操作,然后在重启时进行数据的恢复。
  • SST File,SST文件是一段排序好的表文件,它是实际持久化的数据文件。里面的数据按照key进行排序能方便对其进行二分查找。在SST文件内,还额外包含以下特殊信息:
    • Bloom Fileter,用于快速判断目标查询key是否存在于当前SST文件内。
    • Index / Partition Index,SST内部数据块索引文件快速找到数据块的位置。
  • Memtable,内存数据结构,用以存储最近更新的db更新操作,memtable空间写满后,会触发一次写出更新操作到SST文件的操作。
  • Block Cache,纯内存存储结构,存储SST文件被经常访问的热点数据。

Basic Operation


其次是Basic Operation模块,虽说RocksDB在官网中介绍说是作为主要提供K-V形式的键值存储,但是其内部提供的操作接口绝不仅仅是get,put两类操作,比如还有如下几类能适用于特殊使用场景的操作:

  • Iteration,RocksDB能够支持区间范围内的key迭代器的遍历查找。
  • Compaction Filter,用户可使用Compaction Filter对key值进行删除或其它更新操作的逻辑定义,当系统进行Compact行为的时候。
  • Creating and Ingesting SST files,当用户想要快速导入大批量数据到系统内时,可以通过线下创建有效格式的SST文件并导入的方式,而非使用API进行KV值的单独PUT操作。
  • Delete Range,区间范围的删除操作,比一个个Key的单独删除调用使用更方便。
  • Low Priority Write,当用户执行大批量数据load的操作时但担心可能会影响到系统正常的操作处理时,可以开启此属性进行优先级的调整。
  • Read-Modify-Write,这个操作的实际含义是Merge操作的含义,读取现有键值,进行更新(累加计数或依赖原有值的任何更新操作),将新的值写入到原Key下。 如果使用原始Get/Set API的前提下,我们要调用2次Get 1次,然后再Set 1次,在Merge API下,使用者调用1次就足够了。
  • Transaction,RocksDB内部提供乐观式的OptimisticTransactionDB和悲观式(事务锁方式)的TransactionDB来支持并发的键值更新操作。

System Behavior


在RocksDB内部,有着许多系统操作行为来保障系统的平稳运行。

  • Compression,SST文件内的数据能够被压缩存储来减小占用空间。
  • Rate Limit行为。用户能够对其写操作进行速度控制,以此避免写入速度过快造成系统读延迟的现象。
  • Delete Schedule,系统文件删除行为的速度控制。
  • Direct IO,RocksDB支持绕过系统Page Cache,通过应用内存从存储设置中直接进行IO读写操作。
  • Compaction,数据的Compact行为,删除SST文件中重复的key以及过期的key数据。

Logging/Monitoring


RocksDB内部有以下的日志监控工具:

  • Logger,可用的Logger使用类。
  • Statistic / Perf Context and IO Stats Context,RocksDB内部各类型操作的时间,操作数计数统计信息,此数据信息能被用户用来发现系统的性能瓶颈操作。
  • EventListener,此监听接口提供了一些event事件发生后的接口回调,比如完成一次flush操作,开始Compact操作的时候等等。

Tool


此外,RocksDB还提供以下3大类型的工具

第一类,性能测试工具,

  • Benchmark Tool
  • Stress Tool,压力测试工具

第二类,workload模拟工具:

  • 用户数据访问行为模拟工具
  • Workload生成工具

第三类,性能分析工具,DB Analyzer。

综上所述,就是RocksDB总体框架预览了,每个模块的内部其实还是有很多细节设计可以展开讨论的,感兴趣的同学可阅读wiki链接进行进一步地学习。

引用


[1].https://github.com/facebook/rocksdb/wiki

posted @ 2020-01-12 19:08  回眸,境界  阅读(2703)  评论(0编辑  收藏  举报