RocksDB是FaceBook起初作为实验性质开发的一个高效数据库软件,旨在充分实现快存上存储数据的服务能力。RocksDB的主要设计点是在快存和高服务压力下性能表现优越,支持point lookup 和 range scan。RockesDB 是一个嵌入式的K-V(任意字节流)存储, 支持Get(key)、Put(Key)、Delete(Key)和NewIterator()。RocksDB的基本组成是memtable、sstfile和logfile。RocksDB架构图如下:
Iterator和Snapshot提供了DB在某个时间点的一个一致性视图,快速短期/前台的scan操作比较适合用Iterator,长期/后台操作适合用Snapshot。Iterator过程中会增加引用计数,当实例重启时,Snapshot会丢失。
RocksDB提供了多个操作的事务性,支持悲观和乐观模式。
prefix_extractor来声明一个key_prefix,然后RocksDB为每一个key_prefix存储相应的blooms,提升RangeScan操作。
RocksDB通过checksum来检测磁盘数据损坏。
当用户重复写入一个key时,在DB中会存在这个key的多个value,compaction操作就是来删除这个key的冗余数据。RocksDB也支持多线程并行compaction。多线程并行flush操作可能会引起写停顿。
RocksDB支持全量备份、增量备份和复制。
RocksDb 支持 LRU 和 CLock两种模式。cache的每个分片都有自己的LRU list和hash表来查找使用。每个shard都有个mutex来控制数据并发访问。不管是数据查找还是数据写入,线程都要获取cache分片的锁。CLOCK CACHE的每个shard都有一个cache entry的圆环list。算法会遍历圆环的所有entry寻找unspined entry来回收。
RocksDB原生地就支持三种记录类型,分别为Put、Delete和Merge。Merge可以合并多个Put和Merge记录为一个单独的记录。
MemTable是一种在内存中保存数据的数据结构,一旦MemTable满了,就会转换为只读的不可改变的,然后会创建一个新的MemTable来提供新的写操作。后台线程负责将MemTable中的数据flush到SST file,然后这个MemTable就会被销毁。memtable的默认实现是skiplist,用户也可以使用 HashLinkList、HashSkipList or Vector 来提高查询性能。
每个SST file都有相应的一个Bloom filter。
backup engine一直保持打开状态,不需要在每一次backup或者restore时都重新创建; 另一种加速backup engine 初始化的方法就是删除非必须的backup。
Checkpoints是一个时间点上的snapshot。当使用Read-only模式打开的话,可以支持查询这个时间点上的数据,当使用Read-Write模式打开的话,可以作为一个可写的snapshot。Checkpoints可以作为全量或者新增备份的backup使用。
SST file的index/filter会被分片为多个小 block,并会配备一个索引。当需要读取index/filter时,只有top-level index会load到内存。分片的好处:更高的cache 命中率,节省IO,不用在index/filters中间折衷。SSL文件索引查询性能优化,LSM tree build成功后,每一个层次的SST file的位置是对齐的,甚至,相对于下一层次的文件的位置也是对齐的。基于次,我们可以缩小二分搜索的范围。
Simulation Cache(SimCache)可以帮助用户在模拟的内存容量而不是物理上实际占用内存下预测block cache的性能数据,比如:hit、miss。
RocksDB可以通过两种方式利用分层存储架构:分层存储部署和分层缓存部署。当使用前者时,可以将LSM的数据分布在多层持久化存储中。使用后者时,用户可以使用快速的持久化媒介来提供高性能的读cache服务,避免频繁读取LSM的part数据,提高RocksDB的整体性能。
RocksDB中二阶段提交的实现。本文总结一下共有如下几个要点:
- Modification of the WAL format
- Extension of the existing transaction API
- Modification of the write path
- Modification of the recovery path
- Integration with MyRocks
RocksDB Iterator提供用户以有序的方式前向或者后向遍历DB,也可以seek 到DB的特定key上。
参考: