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

464 阅读6分钟

01.介绍 LSMT 与存储引擎介绍

LSMT 是什么?

一言以蔽之,通过 Append-only Write + 择机 Compact 来维护索引树的结构。 image.png 数据先写入 MemTable,MemTable 是内存中的索引可以用 SkipList / B+Tree 等数据结构实现。当 MemTable 写到一定阈值后,冻结,成为 ImmemTable,任何修改只会作用于 MemTable,所以 ImmemTable 可以被转交给Flush 线程进行写盘操作而不用担心并发问题。Flush 线程收到 ImmemTable ,在真正执行写盘前,会进一步从 ImmemTable 生成 SST(Sorted String Table),其实也就是存储在硬盘上的索引,逻辑上和 ImmemTable 无异。新生成的 SST 会存放于 L0(Layer 0),除了 L0 以外根据配置可以一直有 Ln。SST 每 Compact 一次,就会将 Compact 产物放入下一层。Compact 可以大致理解为 Merge Sort,就是将多个 SST 去掉无效和重复的条目并合并生成新的 SST 的过程。

存储引擎是什么?

image.png 传统数据库大致可以分为

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

介于二者之间还有一些界限比较模糊的组件,比如 Replication,MySQL 是用 bin log 独立于存储引擎,而对于一些 NoSQL 数据库(字节 Abase 1.0)来说,Replication 直接基于存储引擎的 WAL。 计算层主要负责 SQL 解析/ 查询优化 / 计划执行。我们重点关注存储层提供了什么能力。数据库著名的 ACID 特性,在 MySQL 中全部强依赖于存储引擎。

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

  • Atomicity

原子性依赖于存储引擎 WAL(Redo Log)

  • Consistency (Correctness)

一致性需要数据库整体来保证

  • Isolation

隔离性依赖于存储引擎提供 Snapshot(有时候会直接说 MVCC)能力。如果上层没有单独的事务引擎的话,也会由存储引擎提供事务能力。一般的是实现是 2PL(2 Phase Lock) + MVCC。2PL 可以简单理解为对所有需要修改的资源上锁。

  • Durability

持久性依赖于存储引擎确保在 Transaction Commit 后通过操作系统 fsync 之类的接口确保落盘了

02.LSMT 存储引擎的优势与实现

LSMT 与 B+Tree 的异同

先简单回顾下经典 B+Tree 写入流程,

image.png

  • 在B+Tree中,数据插入是原地更新的
  • B+Tree在发生不平衡或者节点容量到达阈值后,必须立即进行分裂来平衡

image.png

  • LSMT B+Tree可以用统—模型描述
  • 从高层次的数据结构角度来看,二者没有本质的不同,可以互相转化
  • 工程实践上还是用LSMT来表示一个 Append-only和Lazy Compact的索引树,B+Tree来表示一个lnplace-Update和Instant Compact的索引树。
  • Append-only和 Lazy Compact这两个特性更符合现代计算机设备的特性。

为什么要采用 LSMT 模型?

HDD时代

image.png

  • 顺序与随机操作性能不对称

由于机械硬盘需要磁盘旋转和机械臂移动来进行读写,顺序写吞吐是随机读的25倍。

SSD 时代:

image.png

  • 顺序写和随机写的不对称性

由于SSD随机写会给主控带来GC压力,顺序写吞吐是随机写的6 倍。

简单总结一下,无论对于 HDD 还是 SSD,顺序写都是一个很好的特质,LSMT 符合这一点,B+Tree 则依赖原地更新,会导致随机写。

LSMT 存储引擎的实现,以 RocksDB 为例

RocksDB 是一款十分流行的开源 LSMT 存储引擎,最早来自 Facebook(Meta),应用于 MyRocks,TiDB,在字节内部也有 Abase,ByteKV,ByteNDB,Bytable 等用户。因此接下来将会以 RocksDB 为例子介绍 LSMT 存储引擎的经典实现。

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

03.LSMT模型理论分析

Cloud-Native LSMT Storage Engine

RocksDB 是单机存储引擎,那么现在都说云原生,HBase 比 RocksDB 就更「云」一些,SST 直接存储于 HDFS 上,Meta 信息 RocksDB 自己管理维护于 Manifest 文件,HBase 放置于 ZK。二者在理论存储模型上都是 LSMT。

image.png

LSMT 模型理论分析

T: size ratio,每层 LSMT 比上一层大多少,L0 大小为 1,则 L1 大小为 T,L2 为 T^2,以此类推

L: level num,LSMT 层数

B: 每个最小的 IO 单位能装载多少条记录

M: 每个 BloomFilter 有多少 bits

N: 每个 BloomFilter 生成时用了多少条 Key

S:区间查询的记录数量

image.png

  • Level

Write:每条记录抵达最底层需要经过 L 次 Compact,每次 Compact Ln 的一个小 SST 和 Ln+1 的一个大 SST。设小 SST 的大小为 1,那么大 SST 的大小则为 T,合并开销是 1+T,换言之将 1 单位的 Ln 的 SST 推到 Ln+1 要耗费 1+T 的 IO,单次 Compact 写放大为 T。每条记录的写入成本为 1/B 次最小单位 IO。三者相乘即得结果。

Point Lookup:对于每条 Key,最多有 L 个重叠的区间,每个区间都有 BloomFilter,失效率为e−MNe^{- \frac{M}{N} } e−NM​,只有当 BloomFilter 失效时才会访问下一层。因此二者相乘可得读取的开销。注意,这里不乘 1/B 的原因是写入可以批量提交,但是读取的时候必须对齐到最小读取单元尺寸。

  • Tier

Write:每条记录抵达最底层前同样要经过 L 次 Compact,每次 Compact Ln 中 T 个相同尺寸的 SST 放到 Ln+1。设 SST 大小为 1,那么 T 个 SST Compact 的合并开销是 T,换言之将 T 单位的 Ln 的 SST 推到 Ln+1 要耗费 T 的 IO,单次 Compact 的写放大为 T / T = 1。每条记录的写入成本为 1/B 次最小单位 IO。三者相乘即得结果。

Point Lookup:对于每条 Key,有 L 层,每层最多有 T 个重叠区间的 SST,对于整个 SST 来说有 T *

L 个可能命中的 SST,乘上 BloomFilter 的失效率即可得结果。

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

04.,LSMT存储引擎调优案例与展望

TerarkDB aka LavaKV 是字节跳动内部基于 RocksDB 深度定制优化的自研 LSMT 存储引擎,其中完全自研的 KV 分离功能,上线后取得了巨大的收益。

KV分离受启发于论文 WiscKey: Separating Keys from Values in sSD-consciousStorage,概括起来就是Value 较长的记录的Value单独存储。

  • 图存储场景描述

    • Key size :20B ~ 30B
    • Value size:数十 KB 级别
    • 写多读少
  • 收益结论:

延迟大幅度降低,长尾消失,扛住了比 RocksDB 高 50% 的负载。

RocksDB# TerarkDB

Flink 流计算场景使用 TerarkDB

  • 收益结论:
  1. 平均 CPU 开销在 3个作业上降低了 26%~39%
  1. 峰值 CPU 开销在广告作业上有明显的收益,降低了 67%
  1. 平均容量开销在 3 个作业上降低了17%~31.2%
  1. 直播业务某集群容量不收缩,TerarkDB 的 schedule TTL GC 彻底解决了该问题

存储引擎最新发展趋势

新硬件

在新的硬件(SMR HDD,Zoned SSD,PMem)上设计存储引擎,

e.g:MatrixKV: Reducing Write Stalls and Write Amplification in LSM-tree Based KV Stores with Matrix Container in NVM

新模型

在现有模型上添加新的扩展,

e.g:KV 分离,WiscKey: Separating Keys from Values in SSD-conscious Storage

REMIX: Efficient Range Query for LSM-trees

新参数 / 新工况

发现现有模型在某些工况中表现不够好,并调整现有参数,

e.g:The Log-Structured Merge-Bush & the Wacky Continuum