leveldb其实就相当于是bigtable中简化的每个数据节点,其中关键性的思想如下(来自于http://www.slideshare.net/sunzhidong/google-leveldb-study-discuss):
也就是说原始的想法就是向如何将随机的io操作转换成顺序的io写操作,下面可能需要考虑的问题就是基于LSM这种数据结构如何进行insert, delete, update操作。这篇论文中写的很详细,如下:
下面只是简单的说明一下如何使用LSM实现上面的操作:
insert:数据首先写入到内存中,之后内存如果到达了一定的阀值之后,再将大块的数据刷新到磁盘上去。
delete操作:使用LSM结构实际上没有数据的删除工作,所谓的删除也仅仅是做标记,那这样可能带来一个问题就是如何保证删除的数据的查询不到?这里就设计到了数据查询的流程,首先肯定是先找内存,之后查找磁盘上的文件,并且磁盘上的文件的查找按照生成文件的先后顺序来排列(这里的假设就是新数据最可能是用户查找的数据)。这样就能保证如果存在某个key是被删除的,那么一定是先找到那个标记了删除的那个键值对,这样就能保证删除的数据是查询不到的。
update:和delete类似,只有追加操作,剩下的操作是在后续compact和spli中完成。
数据恢复:这里使用了通常的做法Write Ahead Log来实现,保证数据的可靠性。
同时上面的论文还提到了FiveMinuteRule原则,基本思想如下:
Simple cost-benefit arguments allow one to compute the break-even point for trading central-memory residence against disc accesses for data. If an item is accessed frequently enough, it should be main memory resident. In current technology, “frequently enough”
means about every five minutes.如果数据被频繁的使用的话,那么就尽量将数据写入到内存中,这里的“频繁”具体是指五分钟,也就是如果数据被使用的频率在5分钟以内,那就尽量经该数据写入到内存中去。
Changing topics, another interesting questionis: “When does it makeeconomic sense to use more memory to save some cpu power?以空间换取时间的想法”, or conversely save some memory atthe expense of some cpu cycles? This issue comes up in codeoptimization where one can
save some instructions by unwinding loops and indata structure design where one can pack data at the expense of masking andshifting operations to extract the data.
The logic is quitesimilar to the Five Minute Rule. Onepicks a certain price for memory (say 5K$/MB) and a certain price per MIP (say50K$/MIP). This means that 5 bytes costabout .005$. Similarly, one instructionper second costs about .005$. So 5 bytescosts
about as much as 1 instruction per second.This gives the rule
Spend 5 bytes of main memory to save 1 instruction per second
更多参考这里:http://www.slideshare.net/xuqianghitsoft/five-minuterule
上面基本上就是leveldb的基本的理论基础,以后的几篇博文中将分析leveldb在代码上如何实现的及对LSM的变形。
分享到:
相关推荐
leveldb 源码,源于google 官方github 源码,解压缩即可
leveldb源码分析 比较全面讲解leveldb leveldb 是 Google 开源的持久化 KV 单机存储引擎,开源页面 http://code.google.com/p/leveldb/。 针对存储面对的普遍随机 IO 问题,leveldb 采用了 merge-dump 的方式,将...
leveldb源码分析
levelDB源码分析记录1
免积分,最新的 leveldb-1.18 源码及leveldb实现解析
leveldb源码工程Windows版,使用vs2010编译通过。有问题可以参考根目录下的Windows文件(使用notepad打开)
包含两个版本的levelDB,1.15.0和1.4.0
Leveldb是一个google实现的非常高效的kv数据库,资源为leveldb实现分析 pdf版本,内容清晰,简介,详实。
leveldb实现解析
详细且纯粹的leveldb源码注解
windows下可编译的leveldb源码,主要用boost库替代linux下移植代码。 修改源码部分: 1.db\c.cc文件中头文件unistd.h 2.port\port.h文件中注明使用的是windows系统 3.无法打开包括文件:“sys/mman.h”: No such ...
图解leveldb源码和中文注释
leveldb是Jeff Dean 和 Sanjay Ghemawat 两位超级大神实现的高效 kv 数据库。本资料对leveldb源码进行了详细的注释,可以帮助初学者快速的阅读源码,了解设计的思想。
Windows下使用VS2012编译成功的leveldb源码工程文件,下载后直接点击.sln文件打开,更改配置后直接可用。生成的LevleDB.lib文件在Debug文件夹中。如果不想编译,也可以直接在自己工程中使用生成的LevleDB.lib库,亲...
leveldb实现解析[归类].pdf
DB leveldb实现解析
googl开源文件数据库,使用key-value方式存储,可作为本地文件缓存。