关于leveldb框架的介绍,已经有无数个大佬进行过详细论述了。以下三篇博客就很不错,本文的图片也基本摘自第一篇博客:
本文为看完以上博客后总结的一些问题,在雄神的鼎力相助下一起阅读源码找到的答案,欢迎交流指正。
目录
一、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恢复后触发垃圾回收机制。