这里写自定义目录标题
引言
LSM树的背景和重要性
十多年前,谷歌发布了大名鼎鼎的"三驾马车"的论文,分别是GFS(2003年),MapReduce(2004 年),BigTable(2006年),为开源界在大数据领域带来了无数的灵感.
在 “BigTable” 的论文中作者提到了Bigtable中用于存储更新数据的机制,这与LSM树(Log-Structured Merge Tree)的概念类似,作者明确提到了LSM树,并将其与Bigtable的设计进行了比较。
Bigtable使用内存表(memtables)和排序字符串表(SSTables)来存储对平板电脑(tablets)的更新,这种方式类似于日志结构合并树(Log-Structured Merge Tree,LSM树)存储索引数据更新的方式。在这两种系统中,排序后的数据首先在内存中进行缓冲,然后再写入磁盘,而读取操作需要合并内存和磁盘中的数据。
在面对亿级别之上的海量数据的存储和检索的场景下,我们选择的数据库通常都是各种强力的NoSQL,比如Hbase,Cassandra,Leveldb,RocksDB等等,这其中前两者是Apache下面的顶级开源项目数据库,后两者分别是Google和Facebook开源的数据库存储引擎。
而这些强大的NoSQL数据库都有一个共性,就是其底层使用的数据结构,都是仿照“BigTable”中的文件组织方式来实现的,也就是我们今天要介绍的LSM-Tree。
LSM树的基础概念
什么是LSM树
LSM-Tree全称是Log Structured Merge Tree,是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了:磁盘批量的顺序写要远比随机写性能高出很多
磁盘顺序写:
将消息先写入到操作系统的页缓存中,由页缓存直接映射到磁盘文件,不需要在用户空间和内核空间直接拷贝消息,也可以认为消息传输是发送在内存中的
磁盘随机写:
磁盘随机写入是指数据写入磁盘时,写入位置不连续,磁盘的磁头需要频繁移动到不同位置进行写入。
LSM树的核心特点是利用顺序写来提高写性能,但因为分层(此处分层是指的分为内存和文件两部分)的设计会稍微降低读性能,但是通过牺牲小部分读性能换来高性能写,使得LSM树成为非常流行的存储结构。
如图所示,顺序内存读写速度>随机内存读写≈顺序io读写>>随机io读写
LSM-Tree的基础结构
LSM-Tree 的基本结构如下图所示:
LSM 树(Log-Structured Merge Tree)由多个层级的