这是我参与「第四届青训营」笔记创作活动的第14天
重点:在文件之上的单节点存储层面,数据是如何存储的
LSMT(1996提出)
早期数据库一般采用B-Tree,2000年之后的多采用LSMT(Hbase,BigTable等)
大致原理流程
存储引擎需要保证
-
ACID
-
屏蔽IO细节,提供更好抽象
如果将细节交给操作系统接管,如使用mmap,会有如下问题。
- predicate push down(一种过滤能力)+提供精准统计信息
LSMT与B+树的异同
高层次数据结构看,两者没有本质不同。
- B+树原地插入;不平衡或结点容量达到阈值时,立即分裂
为什么是LSMT?
存储引擎的实现-write
原子性依赖于WAL
优化:
完整流程示意图:(注:同一时刻发生的事件颜色相同)
解析:选出leader,由leader唤醒其他的work,多个同步进行,最后由一个进行收尾
存储引擎的实现-Snapshot&SuperVision
- 概念:
- 优化:加入Thread Local SuperVersion Cache 原本:读取操作要频繁acquire和release,多核污染问题,对cpu不友好
优化后:读取时只需检查superversion并标记thread local缓存正在使用
存储引擎的实现-Get&BloomFilter
RocksDB的读取也是层层向下。
- 相较于B+Tree,LMST点查需要访问的数据块更多。为了加速点查,LMST引擎会在SST中嵌入BloomFilter。 (BloomFilter:会有假阳性问题,它判定为不在那肯定不在,它判定为在仍有可能不在)
存储引擎的实现-Compact
compact基本思路:将key区间有重叠或无效数据较多的SST进行合并,以加速读取或回收空间。
Level(RocksDB的默认策略)
每一层不允许有SST的key区间重合
Tier
特点:允许每层有多个区间重合的SST 缺点:重合的越多,查询开销就越大
模型算法的复杂度分析
(名词解释)
- T:size ratio,每层LSMT比上一层大多少
- L;level num
- B:bit(每个最小IO单位能装载多少条记录)
- M:每个BloomFilter有多少bits
- N:每个BloomFilter生成时用了多少Key
- S:区间查询的记录数量
level的write
point lookup
关于level和tier的总结
存储引擎的最新发展趋势
新硬件
论文推荐: