1 前言
这是我参与「第四届青训营」笔记创作活动的第28天,在「LSMT 存储引擎浅析」课程中讲师讲解了LSMT相关的一些原理和应用,但并未过多涉及B+树与LSMT两者之间的原理和应用对比,为了对相关知识有更深入的理解,本篇笔记来讨论一下B+树与LSMT的具体原理差异和应用场景的不同。
2 随机存储与顺序存储
我们知道,对机械硬盘而言,由于磁盘需要移动机械臂和转动磁盘来进行读写,因此顺序的读写操作一定优于随机的读写操作,其中顺序写的吞吐是随机读的25倍;而对SSD固态硬盘而言,随机写会给主控带来GC压力(当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收,garbage collection,简称 GC),其中顺序写的吞吐是随机读的6倍。因此,不论是何种存储介质,顺序存储的效率一定比随机存储的效率高。此外,我们在这里直接给出一个结论:顺序写不论在何种介质下,对设备而言都是友好的操作,如果我们能够拥有一个可以充分利用此种情形的数据结构,那么我们的系统对数据的吞吐能力必定能够大大提高。
3 B+树与LSMT
在上一小节中,我们知道了顺序存储的速度要优于随机存储,在某些场景下顺序操作的速度甚至还要远远优于随机操作。那为什么早期的数据库习惯采用B+树,而2000年以后的数据库大多采用LSMT呢?这就要谈到两者的基本原理和应用场景了。
3.1 B+树
在B+树当中,我们为了能够快速读取而使用了多路平衡树,这样可以迅速找到对应key的节点,当我们对B+树进行写入时,数据是原地更新的,在B+树发生不平衡或者节点容量达到阈值后(达到规定的阶数),必须立即进行分裂来平衡,这样就会引起树结构的变化,导致文件的多次随机读写,因此当数据吞吐量很大时,会带来巨大的开销。
3.2 LSMT
而LSMT使用了一种独特的机制牺牲了一些读操作的性能,保证了写操作的能力,它能够让所有的操作顺序化,几乎完全避免了随机读写。这些独特的机制就是SSTable和Memtable。
3.2.1 LSMT之SSTable
再看上图左边图示,如果文件中的数据量过大,借用《操作系统》中内存管理部分的二级页表相关思想,我们建立一个索引文件,存储不同的key值对应的offset,方便我们在读取文件的时候快速查找到我们想要查找的文件,加快读取速度。
3.2.1 LSMT之Memtable
理解了SSTable之后,我们来讨论一下基本的LSM实现原理,其本质就是在SSTable的基础上增加了一个Memtable——一个存放在内存当中的可以快速“增删查改”的数据结构。此外,我们还需要一个log文件记录数据发生的变化,当系统故障或者是数据丢失时提供找回机制,其整体的架构如下所示:
“增删查改”中,除了查找之外的其他操作都发生在Memtable中,我们来讨论一下“增删改”这三种操作:
- 当需要增加一个元素的时候,我们直接增加在Memtable,而不是写入文件,这样避免了大量移动数据,大大增加了写入速度。
- 修改和删除操作也一样,如果需要修改或删除的元素刚好在Memtable当中,那么可以直接进行修改或删除操作;如果不在Memtable当中,我们还是在Memtable当中进行操作,我们会插入这个元素,标记成修改或者是删除(如果先查找到元素,再去修改或删除,就需要进行磁盘读写,而这会消耗大量资源)。
所以我们可以把“增删改”这三个操作都视作成特殊的“添加”,显然这会导致Memtable中积累大量数据。为了解决这个问题,我们定期将Memtable中的内容存储到磁盘,形成一个SSTable(这就是SSTable的来源:SSTalbe中的数据不是凭空产生的,是LSM落盘产生的)。随着我们不断落盘,SSTable的数量也会增加,这样会影响我们查找的效率。而在此之前,我们还存储了许多修改和删除的信息,但没有进行实际操作,因此我们定期将所有的SSTable合并,在合并的过程当中完成数据的修改和删除。也就是说之前的删除、修改操作只是被记录了下来,直到合并的时候才真正执行。
4 总结分析
- 我们在前文对比了LSMT和B+树。在B+树中,我们为了能够快速读取而使用了多路平衡树,正因为平衡树结构的存在,导致我们在写入数据时会引起树结构的变动,这就会涉及到多次文件的随机读写,当数据吞吐量很大的时候,就会带来巨大的开销。而LSMT的读取效率比B+树要低,但是对于大数据的写入支持得更好,在大数据的许多场景中对数据的吞吐量有着很高的要求,这时LSMT的用武之地显然大于B+树(例如消息系统和分布式存储场景)。但是同样,当需要查找效率更高时,B+树处于更大的优势。也就是说,两者只是应用的场景不同,而不是有高低之分。
- 可以看到,在3.2.1小节中,我们只讨论了“增删查改”中的增删改操作,却没有讨论查找操作,这是因为查找的机制和快表机制极其相似,所以在下一篇笔记中我们会将查找与《操作系统》中大名鼎鼎的快表TLB放在一起讨论,并详细阐述著名的「局部性原理」,将新旧知识联系结合起来讨论,加深理解和印象。
5 参考资料
- LSMT 存储引擎浅析——林源劲
- www.isolves.com/hlw/dsj/202…
- baijiahao.baidu.com/s?id=166173…