leveldb的整个结构是非常适合SSD存储特性的。leveldb并不进行随机写,这一点避免了擦除重写SSD带来的性能牺牲。
leveldb 有三种文件 manifest-清单文件,log-日志文件,sst-数据存储文件,current文件。
sstable的主要特点:level-0的sstable文件可能会出现key的重复,而除level-0以外的sstable的key值均不出现重复。SSTable中存储的是有序的数据,而log文件中的key是无序的。
SSTable包含两个部分,数据区和数据管理区。数据管理区包含了数据的元数据信息。
Index block的结构如下:
相邻的block满足上一个block的最后一个key的值要小于下一个block的最小值。索引部分相当于元数据,指出了数据的具体的存储位置。
上图为具体的一个block的结构,block的底部包含了很多个重启点。之前为了压缩存储key,根据内容局部性原理,很有可能出现相邻的key出现了相同的部分的key,将其提取出来可以减少存储的磁盘空间。比如 key1="abcde" key2="abcdf" 那么对于第二条记录,只记录f即可。
但是这样存储却带来了更复杂的磁盘存储格式。
为了避免存储的复杂性,每个block设置了几个重启点,这些重启点指向的key均为完整的key的信息。同样有一个问题,
1.抽时间看看代码,看看leveldb是否每次存key的时候都是和上一条记录比,然后只存与上一条记录不同的部分?
2.如果要读sstable,读到了这个key,那么如何定位完整的key的信息呢(每个key只存了非共享的部分)?
3.每次写入的时候先写日志,是否会带来很大的开销,还原数据的时候,如何根据log文件做replay?
阅读(1984) | 评论(0) | 转发(0) |