为什么LevelDB需要两个以上的级别?

时间:2013-01-13 15:51:24

标签: leveldb

我认为只有两个级别(级别0和级别1)可以,为什么LevelDB需要级别2,级别3等等?

3 个答案:

答案 0 :(得分:10)

我将指出您在LevelDB上的一些文章及其底层存储结构的方向。

所以在documentation for LevelDB  它讨论了各级之间的合并。

  

这些合并具有使用批量读取和写入逐渐将新更新从年轻级别迁移到最大级别的效果(即,最小化昂贵的搜索)。

LevelDB在结构上与Log Structured Merge Trees类似。如果您对分析感兴趣,本文将讨论不同的层次。如果你能通过数学,那么理解数据结构似乎是你最好的选择。

更容易阅读analysis levelDB关于数据存储区与LSM树的关系的讨论,但就你所说的关于所有级别的问题而言:

  

最后,拥有数百个磁盘上的SSTable也不是一个好主意,因此我们会定期运行一个进程来合并磁盘上的SSTable。

LevelDB文档可能提供了最佳答案:(最大化写入和读取的大小,因为LevelDB是磁盘上(慢速搜索)数据存储)。

祝你好运!

答案 1 :(得分:7)

我认为这主要与简单快速合并关卡有关。

在Leveldb中,等级 - (i + 1)约为。与level-i相比数据的10倍。这更类似于多级缓存结构,其中如果数据库在密钥x1到x2之间有1000条记录,那么该范围内最常访问的10条记录将处于级别1,而相同范围内的100条记录将位于在第2级并在第3级休息(这不是确切的,只是为了直观地了解关卡)。在这个设置中,要合并level-i中的文件,我们需要在level-(i + 1)中查看最多10个文件,它们都可以被带入内存,快速合并并写回。这导致为每次压缩/合并操作读取相对较小的数据块。

另一方面,如果您只有2个级别,则一个0级文件中的键范围可能与级别1中的1000个文件匹配,并且所有这些文件都需要打开以进行合并,这将是相当的慢。请注意,这里一个重要的假设是我们有固定大小的文件(比如说2MB)。对于级别为1的可变长度文件,您的想法仍然有效,我认为其中的变体用于HBase和Cassandra等系统。

现在,如果您关注的是查找多个级别的延迟,那么这就像一个多级缓存结构,最近写入的数据将处于更高级别,以帮助典型的参考局部。

答案 2 :(得分:2)

0级是内存中的数据,其他级别是磁盘数据。重要的是,对级别中的数据进行排序。如果level1由3个2Mb文件组成,则在file1中,它是文件2 150..200和文件3 300..400(作为示例)中的键0..50(已排序)。因此,当内存级别已满时,我们需要以最有效的方式将其数据插入磁盘,即顺序写入(使用尽可能少的磁盘搜索)。想象一下,在内存中我们有60-120键,很酷,我们只是将它们按顺序写入文件,在level1中成为file2。效率很高! 但是现在想象level1比level0大得多(这是合理的,因为level0是内存)。在这种情况下,level1中有许多文件。现在我们在内存中的键(60-120)属于许多文件,因为level1中的键范围非常精细。现在要将level0与level1合并,我们需要读取许多文件并进行大量随机搜索,在内存中创建新文件并编写它们。所以这就是许多层次的想法,我们将有许多层,每个层都比前一个(x10)更大,但不是更大,所以当我们必须将数据从i-1迁移到第i层时,我们有一个很有可能必须阅读最少量的文件。

现在,由于数据可能会发生变化,因此可能无需将其传播到更昂贵的更高层(可能会更改或删除),因此我们完全避免了昂贵的合并。最后一级的数据在统计上最不可能发生变化,因此最适合与最后一层合并最昂贵的数据。