LSMT存储引擎浅析 | 青训营笔记

243 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第14天

1. LSMT与存储引擎介绍

言以蔽之,通过Append-only Write+择机Compact来维护结构的索引树。

image.png

存储引擎

以单机数据库M小ySQL为例, 大致可以分为:

  • 计算层
  • 存储层(存储引擎层)

计算层主要负责SQL解析/查询优化/计划执行

数据库著名的ACID特性,在MySQL中全部强依赖于存储引擎。image.png

ACID是什么/存储引擎哪些组件保障了这些特性?

  • Atomicity(原子性)

Write-Ahead Log(WAL)/Redo Log

  • Consistency(Correctness)(正确性)

依赖于数据库整体

  • Isolation(隔离性)

Snapshot 2PL(Phase Lock)

  • Durability(持久性)

Flusher遵循Sync语意

除了保障ACID以外,存储引擎还要负责:

  • 屏蔽IO细节提供更好的抽象
  • 提供统计信息与Predicate Push Down能力

存储引擎不掌控IO细节,让操作系统接管,例如使用mmap,会有如下问题:

  • 落盘时机不确定造成的事务不安全
  • IO Stall
  • 错误处理繁琐
  • 无法完全发挥硬件性能

2. LSTM存储引擎的优势的优势与实现

2.1 LSMT与B+tree的异同

在B+Tree中,数据插入是原地更新的

B+Tee在发生不平衡或者节点容量到达阈值后,必须立即进行分裂来平衡

image.png

  • LSMT与B+Tree可以用统模型描述
  • 从高层次的数据结构角度来看二者没有本质的不同,可以互相转化

image.png

2.2 为什么要采用LSMT模型

·HDD时代,顺序操作远快于随机操作 ·SSD时代,顺序写操作远快于随机写操作 这二者的共性是顺序写是一个对设备很友好的操作,LSMT符合这一点,而B+Tree依赖原地 更新,导致随机写。

2.3 LSMT存储引擎的实现---RocksDB

2.3.1 Write

  • RocksDB写入流程主要有两个优化,批量WAL写入(继承自LevelDB)与并发MemTable更新
  • RocksDB在真正执行修改之前会先将变更写入WAL,WAL写成功则写入成功。

image.png

  • 多个写入者会选出一个Leader,由这个Leader来一次性写入WAL,避免小IO。
  • 不要求WAL强制落盘(Sync)时,批量提交亦有好处,Leader可以同时唤醒其余Vriter,降低了系统线程调度开销。

image.png

  • 没有批量提交的话,只能链式唤醒
  • 链式唤醒加大前台延迟。

image.png

  • 写完WAL还要写MemTable。
  • RocksDB在继承LevelDB的基础上又添加了并发MemTable写入的优化。

image.png

  • WAL一次性写入完成后,唤醒所有Vriter并行写入MemTable
  • 由最后一个完成MemTable写入的Vriter执行收尾工作

image.png

2.3.2 Snapshot&SuperVision

  • RocksDB的数据由3部分组成,MemTable/ImmemTable/SST。持有这三部分数据并且提供快照功能的组件叫做SuperVersion。
  • MemTable和SST的释放依赖于引l用计数。对于读取来说,只要拿着SuperVersion,从MemTable一级一级向下,就能查到记录。拿着SuperVersion不释放,等于是拿到了快照。

image.png

  • 如果所有读者都给SuperVersion的计数加1,读完后再减1,那么这个原子引用计数器就会成为热点。CPU在多核之间同步缓存是有开销的,核越多开销越大。
  • 为了让读操作更好的scale,RocksDB做了一个优化是Thread Local SuperVersion Cache

image.png

  • 没有Thread Local缓存时,读取操作要频繁Acquire和Release SuperVersion
  • CPU缓存不友好

image.png

  • 有Thread Local缓存,读取只需要检查一下SuperVersion并标记ThreadLocal缓存正在使用即可
  • CPU缓存友好

2.3.3 Get&BloomFilter

  • RocksDB的读取在大框架上和B+Tree类似,就是层层向下。
  • 相对于B+Tree,LSMT点查需要访问的数据块更多。为了加速点查,一般LSMT引擎都会在SST中嵌入BloomFilter。

[1,10]表示这个索引块存储数据的区间在1·10之间。查询2,就是顺着标绿色的块往下。

image.png

2.3.4 Compact&level

  • Compact在LSMT中是将Key区间有重叠或无效数据较多的SST进行合并,以此来加速读取或者回收空间。Compact策略可以分为两大类,Level和Tier。下图是Level策略
  • Level策略直接来自于LevelDB,也是RocksDB的默认策略。每一个层不允许有SST的Key区间重合。

image.png

2.3.5 Compact&Tier

Tier策略允许LSMT每层有多个区间重合的SST

image.png

3. LSMT模型理论分析