LevelDB整体架构分析

本文深入探讨了LevelDB的存储系统架构,包括其基于Operationlog的设计原理、KV型存储特性、数据有序分级存储机制、Memtable与Log文件交互、SSTable生成与Compact操作,以及关键文件如Current、Manifest的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LevelDB整体架构分析

1.   整体架构
      Leveldb是一种基于operation log的文件系统,是Log-Structured-Merge Tree的典型实现。LSM源自Ousterhout和Rosenblum在1991年发表的经典论文<<The Design and Implementation of a Log-Structured File System >>。

       概括的说,leveldb是一个kv型的存储库。主要特点如下:
> 单机嵌入式接口
> 持久化存储
> KV系统,提供读写删除操作(kv都是字节序列)
> 支持快照功能,使得读操作不受写操作影响
> 磁盘上的数据是有序的,且分级存储,同时在文件保存相应的索引以加速读操作
> 删除是一种特殊类型的写操作
> 提供压缩操作以减少存储空间
> 写入,延迟写入,通过log保证数据不丢失



2.   简要分析

       从图中可以看出构成LevelDb静态结构的包括六个主要部分内存中的MemTableImmutable MemTable以及磁盘上的几种主要文件Current文件Manifest文件log文件以及SSTable文件当然LevelDb除了这六个主要部分还有一些辅助的文件但是以上六个文件和数据结构是LevelDb的主体构成元素

      LevelDbLog文件和MemtableBigtable论文中介绍的是一致的当应用写入一条Key:Value记录的时候LevelDb会先往log文件里写入成功后将记录插进Memtable这样基本就算完成了写入操作因为一次写入操作只涉及一次磁盘顺序写和一次内存写入所以这是为何说LevelDb写入速度极快的主要原因

      Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据假如没有Log文件因为写入的记录刚开始是保存在内存中的此时如果系统崩溃内存中的数据还没有来得及Dump到磁盘所以会丢失数据Redis就存在这个问题)。为了避免这种情况LevelDb在写入内存前先将操作记录到Log文件中然后再记入内存中这样即使系统崩溃也可以从Log文件中恢复内存中的Memtable,不会造成数据的丢失

      当Memtable插入的数据占用内存到了一个界限后需要将内存的记录导出到外存文件中LevleDb会生成新的Log文件和Memtable,原先的Memtable就成为Immutable Memtable,顾名思义就是说这个Memtable的内容是不可更改的只能读不能写入或者删除新到来的数据被记入新的Log文件和Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘形成一个新的SSTable文件SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的而且SSTable的所有文件是一种层级结构第一层为Level 0,第二层为Level 1,依次类推层级逐渐增高这也是为何称之为LevelDb的原因

      SSTable中的文件是Key有序的就是说在文件中小key记录排在大Key记录之前各个LevelSSTable都是如此但是这里需要注意的一点是Level 0SSTable文件后缀为.sst)和其它Level的文件相比有特殊性这个层级内的.sst文件两个文件可能存在key重叠比如有两个level 0sst文件文件A和文件B,文件Akey范围是:{bar, car},文件BKey范围是{blue,samecity},那么很可能两个文件都存在key=”blood”的记录对于其它LevelSSTable文件来说则不会出现同一层级内.sst文件的key重叠现象就是说Level L中任意两个.sst文件那么可以保证它们的key值是不会重叠的这点需要特别注意后面您会看到很多操作的差异都是由于这个原因造成的

      SSTable中的某个文件属于特定层级而且其存储的记录是key有序的那么必然有文件中的最小key和最大key,这是非常重要的信息LevelDb应该记下这些信息Manifest就是干这个的它记载了SSTable各个文件的管理信息比如属于哪个Level,文件名称叫啥最小key和最大key各自是多少

      Current文件是干什么的呢这个文件的内容只有一个信息就是记载当前的manifest文件名因为在LevleDb的运行过程中随着Compaction的进行SSTable文件会发生变化会有新的文件产生老的文件被废弃Manifest也会跟着反映这种变化此时往往会新生成Manifest文件来记载这种变化Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值