这是我参与「第四届青训营 」笔记创作活动的的第14天
- LSMT与存储引擎介绍
- Log-Structured Merge-Tree
- 早期的数据库系统一般都采用B-Tree家族作为索引,例如MySQL
- 2000年后诞生的数据库大多采用LSMT索引,例如Google BigTable,HBase等
- 是通过Append-only Write+择机Compact来维护结构的索引树
- 存储引擎
- 计算层
- 负责SQL解析/查询优化/计划执行
- 存储层
- 著名的ACID特性,在MySQL中全部强依赖于存储引擎
- ACID
- Atomicity
- Write-ahead Log(WAL)
- Redo Log
- Consistency
- 依赖于数据库整体
- Isolation
- Snapshot
- 2PL(phase Lock)
- Durability
- Flusher遵循Sync语意
- Atomicity
- ACID
- 屏蔽IO细节提供更好的抽象
- 提供统计信息与Predictate Push Down能力
- 存储引擎不掌握IO细节,让操作系统接管,例如使用mmap,会有如下问题:
- 落盘时机不确定造成的事务不安全
- IO Stall
- 错误处理繁杂
- 无法完全发挥硬件性能
- 著名的ACID特性,在MySQL中全部强依赖于存储引擎
- 计算层
- Log-Structured Merge-Tree
- LSMT存储引擎优势与实现
- LSMT与B+Tree的异同
- B+Tree
- 数据插入是原地更新的
- 在发生不平衡或者节点容量到达阈值后,必须立刻进行分裂来平衡
- LSMT
- 数据插入是追加更新的
- 在发生不平衡或者垃圾过多后,由专门的线程进行compact
- LSMT与B+Tree可以用统一模型描述,从高层次的数据结构角度来看,两者没有本质的不同,可以互相转化
- 工程实践上用LSMT表示一个append-only和lazy compact的索引树,这两个特性更符合现代计算机设备的特性
- B+Tree来表示一个Inplace-Update和Instant Compact的索引树
- B+Tree
- 为什么要采用LSMT模型
- All problems in computer science can be solved by another level of indirection
- 在计算机存储乃至整个工程界都在利用Indirection处理资源的不对称性
- 存储引擎面对的资源不对称性在不同时期是不一样的
- HDD时代
- 顺序与随机操作性能不对称
- SSD时代
- 顺序写与随机写性能不对称
- HDD时代
- LSMT存储引擎的实现
- 以RocksDB为例
- Write
- 写入流程主要有两个优化,批量WAL写入与并发Memtable更新
- 多个写入者会选出一个leader,由这个leader来一次性写入WAL,避免小IO
- 不要求WAL强制落盘时,批量提交亦有好处,Leader可以同时唤醒其余writer,降低了系统线程调度开销
- 如果没有批量提交,只能链式唤醒,链式唤醒加大前台延迟
- WAL一次性写入完成后,唤醒所有writer并行写入Memtable
- 由最后一个完成Memtable写入的writer执行收尾工作
- 在真正执行修改之前会先将变更写入WAL,WAL写成功则写入成功
- 写入流程主要有两个优化,批量WAL写入与并发Memtable更新
- Snapshot & SuperVision
- 数据由三部分组成,Memtable/Immemtable/SST,持有这三部分数据并提供快照功能的组件叫做SuperVision
- Memtable和SST的释放依赖于引用计数,对于读取来说,只要拿着SuperVision,从Memtable一级一级向下,就能查到记录。拿着SuperVision不释放,等于是拿到了快照。
- Thread Local Supervision Cache
- 读取只需要检查一下SuperVision并标记Thread Local缓存正在使用即可,CPU缓存友好
- Get&BloomFilter
- 读取在大框架上和B+Tree类似,就是层层向下。
- 相对于B+Tree,LSMT点查需要访问的数据块更多。为了加速点查,一般LSMT引擎都会在SST中嵌入BloomFilter
- Compact
- Compact在LSMT中是将Key区间有重叠或无效数据较多的SST进行合并,以此来加速读取或者回收空间。Compact策略可以分为两大类,Level和Tier
- Level
- 来自于LevelDB,也是RocksDB的默认策略。每一个层不允许有SST的Key区间重合
- 有写放大的问题
- Tier
- 允许每层有多个区间重合的SST
- 读放大的增加换写放大的减少
- Level
- Compact在LSMT中是将Key区间有重叠或无效数据较多的SST进行合并,以此来加速读取或者回收空间。Compact策略可以分为两大类,Level和Tier
- LSMT与B+Tree的异同
- LSMT模型理论分析
- Tier策略降低了写放大,增加了读放大和空间放大
- Level策略增加了写放大,降低了读和空间放大
- 调优案例与展望
- KV分离
- WiscKey:Separating Keys from values in SSD-conscious Storage
- 数据库存两类数据,索引以及用户输入的数据,数据只要可以读就行,不需要跟着compact
- 大value场景,收益很高
- WiscKey:Separating Keys from values in SSD-conscious Storage
- KV分离