levelDB的整体架构见下图1。总体而言分内存和磁盘两部分。
1:memtable:内存中存放key-value的数据结构
2:Immutable memtable:是memtable的副本,一模一样,除了该table只不过是可读的,不能写入。
3:log:日志文件。
4:sstable manifest current:磁盘中存放key-value的数据结构。
当写入一个key-value的时候,首先写入log文件中,然后才会写入memtable中,然后当memtable到达一定程度时,然后转变成Immutable memtable,系统此时会重新创建新的memtable用于插入数据。然后Immutable memtable通过压缩数据存储到磁盘sstable中。
为什么先要写入log文件中呢?以防意外情况发生,导致memtable中的数据未及时写入到磁盘上,如果先写入到log文件中,可以重新进行恢复数据。
下述博客内容主要从源代码进行讲解相关的levelDB的内容,会穿插一些详细的设计策略等,阅读源代码的顺序主要为:
1:include文件夹中包含的.h文件,该文件夹中的文件定义了系统所有使用到的类或者结构体,明白这些类型的定义有助于读懂其他文件夹的类实现或者定义。
2:util文件夹中包含的文件
3:table文件夹包含的文件
4:db文件夹中包含的实现cc文件
本文只讲解大体的架构,后续会继续讲解相关的主要流程以及数据结构等。此文会继续更新。
图1: levelDB架构图(感谢csdn博主sparkliang提供此图,http://blog.csdn.net/sparkliang/article/details/8567602)