前言
LSM文件树是基于Bigtable思想用于levelDB数据库(google两位重量级架构,Jeff Dean和Sanjay Ghemawat所发起的开源数据库)的一个存储结构,在这里做一个简单的理解。
LSM文件树结构与各文件作用解析
LSM文件树在内存中有两种不同的表现形式,分别为MemTable(可读写的内存表空间),ImmutableMemTable(可读不可写的内存表空间),而levelDB表现出来的是以文件存储为优先的存储形式,区别于Redis这样的内存型nosql,所以在磁盘中,LSM文件树表现出几种主要文件,分别为Current文件,Manifest文件,log文件,以及SSTable文件,以上六种元素构成了levelDB的主体。
在LSM文件树中,log文件和MemTable是绑定在一起的,并且log文件的优先级大于MemTable,在插入一条数据时,先向log文件中写入插入的数据,成功之后才将这条数据写入MemTable中,如果出现内存断电这种情况,因为写入log执行级别大于写入内存,不需要担心丢失内存数据,我们可以再次根据log中的内容写入MemTable中,这样就避免了Redis的问题,而且,因为只需执行一次磁盘顺序写和一次内存随机写,大大提高了写的效率。
当MemTable达到一个界限时,会自动转变为ImmutableMemTable,此时该内存可读不可写,会另外开辟一块空间生成新的MemTable和新的log,新到来的数据会被写入到新的log和MemTable中,levelDB后台调度会将ImmutableMemTable导出,生成一个SSTable文件,SSTable就是由这样的不断推演不断产生,并且这些SSTable有一种层级结构,第一层为level0,第二层为level1,这也是levelDB名字的由来。
而SSTable的某个文件属于特定层级,且key有序,那必然存在最大key和最小key,这是树的特征,也是非常重要的信息,Manifest文件就是用来存储这些信息的,它记载了SSTable各个文件的管理信息,比如属于哪一个Level,文件的名称,min key 和max key 各是什么等。
Current文件是用来记录当前Manifest名字的一个文件,随着SSTable文件的变化,会有新的SSTable产生,也会有废弃的SSTable被删除,Manifest文件也在随之变化,也会生成新的Manifest文件来记录这种变化,Current就是记录当前的Manifest的文件名,方便我们能够轻易查看到当前数据变化的Manifest的一个文件。