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

108 阅读4分钟

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