LSM树

Posted by 皮皮潘 on 12-02,2021

LSM树中虽然带树字,但是它的核心并不是树,而是一种设计思想:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘

LSM树通过牺牲一定的读性能,大大地提高了写性能

它的核心在于三点:

  • 在每次写内存前将操作Append到对应的日志中,从而持久化
  • 在内存中以及磁盘中都使用特定的数据结构(在内存中是树,在磁盘中是SST,Sorted String Table)有序地存储,从而可以加快合并速度
  • 随着内存中存储的数据逐渐增大,超过阈值则flush到磁盘中,而磁盘中的数据也定期做Merge以及分层,从而优化读性能

数据操作:

  • 写入数据:数据首先会插入内存中的树。当内存树的数据量超过设定阈值后,会进行合并操作。合并操作会从左至右遍历内存中树的子节点 与 磁盘中SST对应子节点并进行合并,会用最新更新的数据覆盖旧的数据
  • 读取数据:在需要进行读操作时,总是从内存中的排序树开始搜索,如果没有找到,就从磁盘上的SST顺序查找
  • 更新数据:LSM树的数据更新不需要磁盘访问,在内存即可完成,在合并的时候真正写入磁盘
  • 删除数据:LSM树的数据删除并不是物理删除。而是一个逻辑删除,会在被删除的数据上打上一个标签,当内存中的数据达到阈值的时候,会与内存中的其他数据一起顺序写入磁盘。,虽然这种操作会占用一定空间,但是LSM-Tree 提供了一些机制回收这些空间。