LSM

Posted by BY KiloMeter on September 22, 2019

LSM(Log Structured Merge Trees),LSM-Tree应用于HBase、Druid等大数据组件中,它也是一种树形的数据结构,那它和之前所学的B+树、B树这些有什么区别呢(B树、B+树相关的可以看这篇B树、B+树、红黑树、AVL树)。

众所周知,无论是机械硬盘(HDD),还是固态硬盘(SSD),对数据的顺序读写都远高于随机读写(差距至少是三个数量级),而在前面的博客中可以知道,数据库的索引一般是以B+树作为底层的数据结构的,对于数据的插入、删除等操作是会产生较多的随机磁盘读写,于是LSM-Tree应运而生。

LSM树的设计思想非常朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。LSM树就是牺牲了部分读性能,提高了写性能。

LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。

HBase存储设计的主要思想就是用到了LSM-Tree

  • 因为小树先写到内存中,为了防止内存数据丢失,写内存的同时需要暂时持久化到磁盘(WAL),对应了HBase的MemStore和HLog
  • MemStore上的树达到一定大小之后,需要flush到HRegion磁盘中(一般是Hadoop DataNode),这样MemStore就变成了DataNode上的磁盘文件StoreFile,定期HRegionServer对DataNode的数据做merge操作,彻底删除无效空间,多棵小树在这个时机合并成大树,来增强读性能。