Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1896484
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 服务器与存储

2014-01-25 10:56:38

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) |
0

上一篇:程序优化方法

下一篇:http断点续传的秘密

给主人留下些什么吧!~~