这是我参与「第五届青训营 」伴学笔记创作活动的第 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)、压缩、统计等。
数据写入
流程
- 记录日志。
- 把数据写入到内存中的 Memtable(不管是插入、更新还是删除数据,都是写入 Memtable)。
- 当 Memtable 大小到达上限时,当前 Memtable 转变为不可修改的 Immutable Memtable,然后创建一个新的 Memtable 供数据写入。
- 把 Immutable Memtable 写入磁盘。
分析
LSM-Tree 写入速度快、流程简单,不管是插入、更新还是删除数据,只需要在日志和 Memtable 上各添加一条记录即可,彻底消除了随机写。
数据查询
流程
- 按照以下顺序依次查找,直到找到数据为止:Memtable -> Immutable Memtable -> L0 SSTable -> L1 SSTable -> ... -> LN SSTable。
分析
从流程上可以看出,我们需要读取和查找并不包含目标数据的 SSTable,即读放大(Read Amplifcation)。为了避免过多读放大现象的发生,LSM-Tree 有以下几种优化方法:
- 布隆过滤器:布隆过滤器可以快速确定数据不在 SSTable 中,无需读取数据 block。
- 缓存:SSTable 是不可变的,可以放入缓存中。
- 合并(Compaction):把多个 SSTable 合并为一个 SSTable,同时物理删除旧数据和已经被删除的数据,减少磁盘占用。