LSM-Tree | 青训营笔记

211 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天,记录一下对 LSM-Tree 的学习。

简介

LSM-Tree 全称为 Log-Structured Merge Tree,是一个针对 HDD 和 SSD 特点而设计的数据存储结构。它的核心理念是磁盘的顺序写速度要比随机写速度快得多。

架构

从图中可以看出,LSM-Tree 的数据由两部分组成,一是内存中的一个 Memtable 和 一个或多个 Immutable Memtable,二是磁盘中多个 level 的 SSTable。Level 越小,表示该层级的 SSTable 数据越新,level 越大,表示该层级的 SSTable 数据越旧。

Memtable 的数据结构往往是跳表(Skip List),支持高效的数据插入、排序和查找。

SSTable 是有序的、不可修改的,一般由一组元数据 block 和数据 block 组成。元数据 block 存储了 数据 block 的元信息,如索引、布隆过滤器(Bloom Filter)、压缩、统计等。

lsm.png

数据写入
流程
  1. 记录日志。
  2. 把数据写入到内存中的 Memtable(不管是插入、更新还是删除数据,都是写入 Memtable)。
  3. 当 Memtable 大小到达上限时,当前 Memtable 转变为不可修改的 Immutable Memtable,然后创建一个新的 Memtable 供数据写入。
  4. 把 Immutable Memtable 写入磁盘。
分析

LSM-Tree 写入速度快、流程简单,不管是插入、更新还是删除数据,只需要在日志和 Memtable 上各添加一条记录即可,彻底消除了随机写。

数据查询
流程
  1. 按照以下顺序依次查找,直到找到数据为止:Memtable -> Immutable Memtable -> L0 SSTable -> L1 SSTable -> ... -> LN SSTable。
分析

从流程上可以看出,我们需要读取和查找并不包含目标数据的 SSTable,即读放大(Read Amplifcation)。为了避免过多读放大现象的发生,LSM-Tree 有以下几种优化方法:

  1. 布隆过滤器:布隆过滤器可以快速确定数据不在 SSTable 中,无需读取数据 block。
  2. 缓存:SSTable 是不可变的,可以放入缓存中。
  3. 合并(Compaction):把多个 SSTable 合并为一个 SSTable,同时物理删除旧数据和已经被删除的数据,减少磁盘占用。
参考

dl.acm.org/doi/abs/10.…

www.jianshu.com/p/b43b856e0…