这是我参与「第四届青训营 」笔记创作活动的第11天
1. LSMT 与存储引擎介绍
1.1. LSMT的历史
1.2. LSTM是什么
1.3. 存储引擎是什么
以单机数据库MySQL为例,
大致可以分为
- 计算层
- 存储层(存储引擎层)
计算层主要负责SQL解析/查询优化/计划执行
数据库著名的ACID特性,在MySQL中全部强依赖于存储引擎
2. LSMT存储引擎的优势与实现
2.1. LSMT与B+ Tree的区别
- 在B+ Tree中,数据插入是原地更新的
- B+ Tree在发生不平衡或者节点容量达到阈值后,必须立即进行分裂来平衡
- LSMT与B+ Tree可以统一模型描述
- 从高层次的数据结构角度来看,二者没有本质的不同,可以互相转化
- 工程实践上还是用LSMT来表示一个Append-only 和 Lazy Compact的索引树,B+ Tree来表示一个Inplace-Update 和Instant Compact的索引树
- Append-only和Lazy Compact这两个特性更符合现在计算机设备的特性
2.2. 为什么要采用LSMT模型
- 在计算机存储乃至整个工程界都在利用Indirection处理资源的不对称性
- 存储引擎面对的资源不对称性在不同时期是不同的
HDD时代 -顺序与随即操作性能不对称
由于机械硬盘需要磁盘旋转和机械臂移动来进行读写,顺序写吞吐是随机的25倍
SSD时代
- 顺序写与随机写性能不对称
由于SSD随机写会给主控带来GC压力,顺序写是随机写的6倍
2.3. LSMT 存储引擎的实现,以RocskDB为例
2.3.1. LSMT存储引擎的实现 - Write
- RocksDB写入流程主要有两个优化,批量WAL写入(继承自Level DB)与并发MemTable更新
- RocksDB在真正执行修改之前会先将变更写入WAL,WAL写成功则写入成功
- 多个写入者会选出一个Leader,由这个Leader来一次性写入WAL,避免小IO
- 不要求WAL强制落盘(Sync)时,批量提交亦有好处,Leader可以同时唤醒其余Writer,降低了系统线程调度开销
- 没有批量提交的话,只能链式唤醒
- 链式唤醒加大前台延迟
- 写完WAL 还要写 MemTable
- RocksDB在继承LevelDB的基础上又添加了并发MemTable写入的优化
- WAL一次性写入完成后,唤醒所有Wirter并行写入MemTable
- 由最后一个完成MemTable写入的Writer执行收尾工作