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

125 阅读4分钟

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

1. LSMT的历史

LSMT是 Log-Structured Merge-Tree的缩写,由Patrick O 'Neil etc.在1996年的论文,The Log-Structured Merge-Tree (LSM-Tree),提出。

相较而言,B-Tree出现就早得多了,在1970年由 Bayer, R.; McCreight,E.提出。

早期的数据库系统一般都采用 B-Tree家族作为索引,例如MySQL。2000年后诞生的数据库大多采用LSMT索引,例如Google BigTable,HBase,Canssandra等。

2. LSMT 是什么?

image.png

3. 为什么要用LSMT

  • 在B+Tree 中,数据插入是原地更新的
  • B+Tree在发生不平衡或者节点容量到达阈值后,必须立即进行分裂来平衡
  • LSMT B+Tree 可以用统一模型描述
  • 从高层次的数据结构角度来看,二者没有本质的不同,可以互相转化
  • 工程实践上还是用LSMT来表示一个Append-only和Lazy Compact的索引树,B+Tree 来表示一个Inplace-Update和Instant Compact的索引树。
  • Append-only 和 Lazy Compact这两个特性更符合现代计算机设备的特性
  • 相对于B+树的优势
    • 顺序写对SSD设备更友好,Append-only 和 Lazy Compact更符合现代计算机的特性
    • SST 不可修改的特性使得其能使用更加紧凑的数据排列和加上压缩
    • 后台延迟 Compact 能更好利用 CPU 多核处理能力,降低前台请求延迟
  • 相对于HashTable的优势
    • LSTM更通用,既能点查询,又能是顺序查询,而Hashtable只能点查询

4. 存储引擎是什么?

  • 以单机数据库MySQL为例,大致可以分为:

    • 计算层
    • 存储层(存储引擎层)
  • 计算层主要负责SQL解析/查询优化/计划执行。

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

  • ACID

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

    • 屏蔽IO细节提供更好的抽象
    • 提供统计信息与Predicate Push Down能力
  • 存储引擎不掌控IO细节,让操作系统接管,例如使用mmap,会有如下问题:·

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

5. LSMT 存储引擎

RocksDB 是一款十分流行的开源 LSMT 存储引擎,最早来自 Facebook(Meta),应用于 MyRocks,TiDB,在字节内部也有 Abase,ByteKV,ByteNDB,Bytable 等用户。

  • Write
  • Snapshot & SuperVision
  • Get & BloomFilter
  • Compact

5.1 以RocksDB为例

  • RocksDB是一款十分流行的开源LSMT存储引擎,最早来自Facebook (Meta),应用于MyRocks,TiDB等数据库。
  • 在字节内部也有Abase,ByteKV,ByteNDB,Bytable 等用户。

5.2 Write

多个写入者会选出一个 Leader,由这个 Leader 来一次性写入。这样的好处在于可以批量聚合请求,避免频繁提交小 IO

5.3 Snapshop & SuperVision

  • RocksDB的数据由3部分组成,MemTable/ lmmemTable / SST。持有这三部分数据并且提供快照功能的组件叫做SuperVersion。
  • MemTable 和SST的释放依赖于引用计数。对于读取来说,只要拿着SuperVersion,从MemTable 一级一级向下,就能查到记录。拿着SuperVersion不释放,等于是拿到了快照。
  • 如果所有读者都给SuperVersion的计数加1,读完后再减1,那么这个原子引用计数器就会成为热点。CPU在多核之间同步缓存是有开销的,核越多开销越大。
  • 为了让读操作更好的scale,RocksDB做了一个优化是Thread Local SuperVersionCache

5.4 Get & BloomFilter

RocksDB读取是层层向下的,相对于B+Tree, LSMT点查需要访问的数据块更多

  • 优化
    • 在SST中嵌入BloomFilter加速点查
    • 两层索引
    • 前缀压缩

5.5 Compact

LSMT中将Key区间有重叠或无效数据较多的SST进行合并,以此来加速读取或回收空间

  • Level

    • 每一层不允许有SST的Key重合
    • 缺点:
      • 存在写放大的问题
      • 实际上,将L0作为例外,允许有SST Key区间重叠来降低写放大
  • Tier

    • 允许LSMT每层有多个区间重合的SST
    • 缺点
      • 每层的区间内重合的SST越多,读取时查询的SST越多
      • 用读放大的增加换取了写放大的减小

5.6 Cloud-Native LSMT Storage Engine --- HBase

  • RocksDB是单机存储引擎,那么现在都说云原生,HBase 比 RocksDB就更「云」一些SST直接存储于HDFS上。
  • 二者在理论存储模型上都是LSMT。

5.7 LSMT模型理论分析

  • Level 策略增加了写放大,降低了读和空间放大
  • Tier 策略降低了写放大,增加了读放大和空间放大

总结

  1. 了解了 LSMT 与存储引擎
  2. 分析了 LSMT 存储引擎的优势与实现
  3. LSMT 模型理论分析
  4. 明白了 LSMT 存储引擎调优

参考

  1. 【大数据专场 学习资料五】第四届字节跳动青训营 - 掘金 (juejin.cn)
  2. LSMtree.Acta.Inf.Pat (umb.edu)