LSM-Tree(The Log Structured Merge Tree) 是指日志结构的合并树,是针对写入速度瓶颈而提出的一种存储策略。
HBase、LevelDB、RocksDB、Cassandra等系统中都有用到。
日志结构思想:将整个磁盘看成一个日志文件,在日志文件中存储持久性数据,针对数据每次只会追加到日志尾部,将众多小文件合并在一起,使得堆日志分散性的存储转换成了大批量的传输,充分降低磁盘寻道的开销,提高了系统的读取效率。
借鉴日志数据的写入操作都为追加操作,提出了一种批量持久化的数据存储策略LSM-Tree。LSM-Tree对数据的更新操作在合并时进行处理,特别适用于存在大量写入操作的应用场景中。
多部件LSM-Tree原理:在数据不断写入时,可以在C0与C1之间引入一个C,并将这个C存放到磁盘中,当C的规模达到一定程度后,可以再增加一个C,以此类推,在数据规模不断扩大时,磁盘中C的数目会不断增加,如上图所示;
其中将C0存放在内存,将C1到Ck存放在磁盘中,C1到Ck的大小不断增大,在数据写入的过程中,当Ci的数据量达到一定程度时,将Ci和Ci+1进行合并,使Ci中的数据转移到Ci+1中。这种合并是异步的,通过这种合并的方式,可以根据冷热程度来进行存储,在合并的过程中,冷数据会不断合并最后到达Ck,这就是多部件LSM-Tree的存储原理。
LevelDB总体架构:Memtable表示了位于内存的C0tree,而Level0 SST表示位于磁盘的C1 tree,一次类推,而Level N SST表示磁盘中Ck tree。当Memtable的数据量达到一定的阈值后,LevelDB就会创建一个新的Memtable,此时旧的Memtable将变成不可写的Immutable Memtable,系统异步地将Immutable Memtable合并到磁盘的Level0 SST中,当i-1层SST文件的总大小或者文件数量超过一定的阈值后,第i-1层的SST文件就会和第i层的进行合并,经过大量的合并操作后最终会达到第N层。LevelDB的Log组建表示日志,日志表示磁盘,数据在写入到Memtable的同时会添加到Log的尾部,这样保证系统宕机时内存中数据不会丢失,Manifest则保存了SST文件的元数据信息。
from 基于时空特性数据的分布式存储系统的设计与实现-uestc
[1] 基本概念 — leveldb-handbook 文档
[2] https://blog.youkuaiyun.com/weixin_38070782/article/details/106902570