LSM树随笔

Log Structured Merge Trees(LSM) 原理

基础:磁盘顺序读写速度比随机读写性能高2个数量级

LSM的目的

 LSM使用顺序读写来优化随即读写

为了使用磁盘顺序写的高性能,使用append only(插入、删除、更新都在日志尾部添加)来实现顺序写,达到提高写入速度。查询通过文件末尾倒序查询,来查找所需数据,所以查询时间复杂度为O(N).

可以通过hash索引来优化查询。但是hash索引的问题是:范围查询和排序会非常慢(需要全表扫描)。

 传统对于读取的优化可以使用,hash,B-树。
 问题是:Hash范围查询和排序会很慢,B-树无法使用随即写(或者说非常困难在磁盘上维持顺序写)。

LSM使用顺序读写来优化随即读写

很多树结构可以不用 update-in-place,
最流行就是,append-only Btree
也称为 Copy-On-Write Tree(写时复制---需要继续弄清楚原理)。

了解LSM需要知道SSTable(sorted string table--)。
SSTable:排序字符串表。要求在文中存储的数据按照顺序排列。

关键之处:

相对于B树的排序性质,SSTable使用顺序写替代随机写。
相对于随机写(append log),SSTable是有序的,这样可以进行范围查询和排序。

1、这样可以用来进行范围查询,排序。
2、SSTable分段合并之后的文件依然是有序的。
3、索引可以使用稀疏索引(只存部分索引值),应为排序特性,可以扫描索引之间的内容进行匹配。

如何构建和维护SSTable

到目前为止,如何让你的数据首先被按键排序呢?我们的传入写入可以以任何顺序发生。

在磁盘上维护有序结构是可能的(参阅“B树”),但在内存保存则要容易得多。有许多可以使用的众所周知的树形数据结构,例如红黑树或AVL树。使用这些数据结构,您可以按任何顺序插入键,并按排序顺序读取它们。

现在我们可以使我们的存储引擎工作如下:

1、写入时,将其添加到内存中的平衡树数据结构(例如,红黑树)。这个内存树有时被称为内存表(memtable)。

2、当内存表大于某个阈值(通常为几兆字节)时,将其作为SSTable文件写入磁盘。这可以高效地完成,因为树已经维护了按键排序的键值对。新的SSTable文件成为数据库的最新部分。当SSTable被写入磁盘时,写入可以继续到一个新的内存表实例。

3、为了提供读取请求,首先尝试在内存表中找到关键字,然后在最近的磁盘段中,然后在下一个较旧的段中找到该关键字。

4、有时会在后台运行合并和压缩过程以组合段文件并丢弃覆盖或删除的值。

这个方案效果很好。它只会遇到一个问题:如果数据库崩溃,则最近的写入(在内存表中,但尚未写入磁盘)将丢失。为了避免这个问题,我们可以在磁盘上保存一个单独的日志,每个写入都会立即被附加到磁盘上,就像在前一节中一样。该日志不是按排序顺序,但这并不重要,因为它的唯一目的是在崩溃后恢复内存表。每当内存表写出到SSTable时,相应的日志都可以被丢弃。

LSM树即是通过SSTable来构建。(当然有很多细节需要注意)

参考资料
1、《Designing Data-Intensive Application》
2、 LSM树原理

你可能感兴趣的:(LSM树随笔)