一、RocksDB是什么
- 常见的数据库如 Redis Mysql Mongo 可以单独提供网络服务
- RocksDB提供存储服务,是一个嵌入式KV存储引擎
- Rocksdb没有server code,用户需要自己实现server的部分来得到c-s架构的数据库。
二、RocksDB的诞生
- 基于flash存储和ssd普及,网络latency在query workload latency中占据的比例越来越高。嵌入式数据库变得受欢迎。
- dhruba尝试比较HBase/HDFS和mysql在query serving workload上的表现。经过多次优化后,在机械硬盘上,几pb的数据集下,hbase可以达到比Mysql慢两倍的查询速度。dhruba开始试图扩展hdfs/hbase的能力,使其能serve query workload。但是随着flash的普及,他发现hdfs对flash的使用效率不高。并且将hdfs/hbase改成嵌入式的难度太高,因此他决定开发新的数据库存储引擎。3. 当时已有嵌入式数据库,leveldb是其中的佼佼者
- leveldb存在的问题
- 单线程compaction + flush,这导致写入速度不够快,并且还有stall的问题,latency p99太高。
- leveldb不能用到flash的所有IO能力。
RocksDB基于LevelDB开发:
三、RocksDB的“社会关系”
- RocksDB 是 facebook 基于 LevelDB 研发的一个嵌入式KV存储引擎,以C++ Library的形式提供使用(目前也已经支持Java)。
- 分布式领域的三驾马车:
- GFS 分布式文件系统
- BigTable 分布式KV存储
- MapReduce 基于分布式文件系统、分布式KV存储的大数据处理 - 两种使用方式:
- 直接作为单机版KV数据库引擎使用: Flink采用RocksDBStateBackend来存储状态
- 作为数据存储系统引擎使用: 在其上面实现分片和多副本,从而实现一个真正的分布式存储系统,以Rocksdb作为其某个副本的存储介质,上层通过Paxos或者Raft协议来保证副本之间的数据一致性。
四、RocksDB基本原理
4.1 整体架构
RocksDB是一个lsm-tree style的数据库
4.2 LSM Tree
4.2.1 核心思想
内存顺序IO >> 内存随机IO ≈ 磁盘顺序IO >> 磁盘随机IO
4.2.2 对比: B+ 树
B+树是一个常用的存储结构,很多开源数据库都是基于B+树。1. 主要优点:
- 结构比较扁平,高度低(一般不超过4层),随机寻道次数少;
- 数据存储密度大,且都位于叶子节点,查询稳定,遍历方便;
- 叶子节点形成有序链表,范围查询转化为顺序读,效率高。相对而言B树必须通过中序遍历才能支持范围查询。
- 主要缺点:
- 如果写入的数据比较离散,那么寻找写入位置时,子节点有很大可能性不会在内存中&#x