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