levelDB源码学习总结

关于leveldb框架的介绍,已经有无数个大佬进行过详细论述了。以下三篇博客就很不错,本文的图片也基本摘自第一篇博客:

LevelDB原理探究与代码分析

Leveldb二三事

leveldb实现原理

本文为看完以上博客后总结的一些问题,在雄神的鼎力相助下一起阅读源码找到的答案,欢迎交流指正。

目录

一、log日志文件相关

二、跳表相关(memtable)

三、sstable相关

四、manifest文件相关


一、log日志文件相关

1、Log日志文件结构?

 

2、如何实现的log日志顺序读写?

       从文件的角度,数据库操作被顺序写入的log文件;从操作系统的角度,linux 文件系统ext4会将文件分散在整个磁盘,在文件之间留有大量的自由空间,而不是像Windows那样将文件一个接一个的放置。当一个文件被编辑了并且变大了,一般都会有足够的自由空间来保存文件。如果碎片真的产生了,文件系统就会尝试在日常使用中将文件移动来减少碎片,所以不需要专门的碎片整理程序。同时log文件的大小是有大小限制的,最大为1M,这样就可以尽量保证一个log文件在一块连续的区间,而读写操作使用了内存映射的系统调用。

 

3、Down机恢复如何实现?

       每次打开一个DB的时候,首先根据当前manifest文件恢复信息到当前version(version提供对各文件的操作方法),从而获取包含down机后没有dump进disk的操作的log文件,再根据这些log文件重构memtable,并将其dump到磁盘中进行compaction操作,这时就保证了down机时丢失数据的恢复。恢复过程中新建了一个version,遍历db目录下所有文件,将文件元信息写入manifest,再将current指向manifest文件。

 

4、什么扩容机制?

       如果前一次映射的空间已写满,则先将文件扩展一定的长度(每次扩展的长度按64KB,128KB,...的顺序逐次翻倍,最大到1MB),然后映射到内存,对映射的内存再以32KB的Page进行切分,每次写入的日志填充到Page中,攒积一定量后Sync到磁盘上

 

5、新老日志文件如何更换?

       Leveldb有自己的垃圾回收机制,当触发时会删除过期文件(包括log文件)。触发时机有三:

       a、将immemtable转化为sstable触发leveldb的垃圾回收机制。

       b、后台compaction时触发垃圾回收机制。

       c、open一个db,将db恢复后触发垃圾回收机制。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值