RocksDB中文网 | 一个持久型的key-value存储
rocksdb是一种KV存储引擎,常用于数据库存储数据,无法直接使用,没有提供sql命令,通过调用rocksdb提供的api进行数据库的读写等操作。
rocksdb是以leveldb为基础开发的,都使用了LSM Tree来存储数据,
设计目标:满足使用需求的同时,提供高性能的存储,相比leveldb提供了很多额外的特性,优化性能
官网链接:Home · facebook/rocksdb Wiki · GitHub
存储架构|聊聊 LSM Tree 强悍的设计 - 墨天轮
rocksdb设计架构 - 知乎
LSM-Tree全称Log Structured Merge Tree,是一种分层、有序、面向磁盘的数据结构,其核心思想是充分利用磁盘的顺序写性能要远高于随机写性能这一特性,将批量的随机写转换为一次性的顺序写。
LSM-Tree的写入操作,类似于普通的日志写入方式,以Append的模式追加,删除操作Append一条删除的日志;修改操作Append一条新key-value。
LSM-Tree有内存组件和硬盘组件两部分。
内存组件:包含Memtable和Immutable MemTable,Memtable内部使用红黑树或者跳表来保证结构的有序性
硬盘组件:包含不同Level的SSTable(sorted string table)
WAL(Write-Ahead-Log)预写日志,用于保证宕机时数据不丢失。
写入数据时,同时写入MemTable和WAL;由于WAL是顺序写,速度很快。
当程序宕机时,可以从WAL恢复数据到MemTable
SSTable(sorted string table)是Immutable MemTable在磁盘上的存储,内部按key顺序排列。
为了加快SSTable的查询速度,在SSTable中增加索引信息(如下图),可以快速定位key并查到其value
一个SSTable将由多个被称为Segment的排序文件组成
磁盘中低Level的SSTable被合并到高Level中,合并过程中,可以做删除操作,降低磁盘使用。
Leveling Merge Policy:
Tiering Merge Policy:
空间放大:space amplification
如果一项数据更新了多次,这项数据可能会存储在多个不同的SSTable中,甚至一项数据的不同部分的最新内容存储在不同的SSTable中。
这样一份数据在磁盘中存储了多份副本,而老的副本是过时的,数据实际占用的空间比有效数据大。
LSM Tree将这一现象称为空间方法(space amplification)。
读放大:read amplification
空间方法的现象导致LSM Tree查找时,从最老-->最新逐个level查询SSTable;如果目标数据不在最底层的level N中,那么我们就读取和查询了所有的SSTable.
LSM Tree将这种读取和查找了无关SSTable的现象称为读放大(read amplification)。
从查找过程可以看出,LSM-Tree的读取速度要比其他结构慢,若遇到“读放大”,则查询速度则是灾难性的。
故需要使用一些索引技巧进行优化:
manifest文件记录所有的SSTable信息,比如Level、最小key、最大key等,可以用于快读定位目标SSTable。
这样在查找时,先将SSTable的manifest读到内存中再进行判断,不用整个SSTable读入。
每个SSTable文件中加入索引块,索引块中记录key及其offset,key按顺序排列。
这样在查找时,先在索引中二分查找key和offset,然后再到SSTable中读取key-value。
对SSTable指定布隆过滤器,判定一个SSTable是否包含特定的建,以减少访问磁盘次数。
这样在查找时,根据BloomFilter可以快速确定某个key是否在当前SSTable中。
将多个SSTable合并为一个SStable,删除旧数据或标记为已删除的数据,降低空间放大;
同时,减少SSTable,降低读放大。
B+树的特点:插入和搜索的性能很高,算法的时间复杂度是O(logn)
学大数据必懂系列之LSM-Tree-腾讯云开发者社区-腾讯云
LSM-Tree 概念解析