首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水平压缩策略如何确保90%的读取来自一个稳定的

水平压缩策略如何确保90%的读取来自一个稳定的
EN

Stack Overflow用户
提问于 2015-04-21 08:10:18
回答 1查看 6.6K关注 0票数 11

我试图了解如何在卡桑德拉的水平压实战略,以保证90%的阅读将满足从单一的稳定。

来自DataStax医生:

新的马厩被添加到第一层,L0,并立即与L1中的马厩进行压缩。当L1被填满时,额外的马厩被提升到L2。在L1中生成的后续马厩将与与其重叠的L2中的马厩进行压缩。

EN

回答 1

Stack Overflow用户

发布于 2015-04-21 10:58:43

卡桑德拉的LeveledCompactionStrategy (LCS)实现了LevelDB的内部结构。您可以在LevelDB实现文档中检查确切的实现细节。

为了给你一个简单的解释,考虑到以下几点:

  1. 当达到固定(相对较小)的大小限制时,将创建每个SSTable。默认情况下,L0获取5MB文件的文件,每个后续级别的都是大小的10倍。(在L1中,您将拥有50 on的数据,L2 500 on,等等)。
  2. 创建SSTables时,保证它们不重叠
  3. 当一个级别填满时,就会触发压缩,并将级别-L+1的马厩提升到级别-L+1。因此,在L1中,在~10个文件中有50 L2,在~100个文件中有L2 500 L2,等等。

以粗体表示的相关细节证明90%的读取来自同一个文件(SSTable)是合理的。让我们一起算算,一切都会变得更清晰。

假设您在L0中有键A、B、C、D、E,每个键都需要1MB的数据。

接下来,我们插入键F,因为0是填充的,压缩将创建一个文件,在级别1中使用A、B、C、D、E,而F将保持在级别0。

这是L1中一个文件中数据的83%。

接下来,我们插入G,H,I,J和K,所以L0又填满了,L1得到了一个新的可稳定的I,G,H,I,J。

到目前为止,我们已经得到了L0中的K,A,B,C,D,E和F,G,H,I,J在L1中

这是L1中90%的数据。

如果我们继续插入键,我们将绕过相同的行为,因此,这就是为什么您从大致相同的文件/SSTable中获得90%的读取服务。

在我提到的链接(压缩选择的大小不同,因为它们是LevelDB默认值,而不是C*s)上,提供了更深入和更详细的信息(更新和墓碑会发生什么):

当L级的大小超过其极限时,我们将其压缩成一个背景线程。压缩从级别L中选择一个文件,从下一级别L+1中选择所有重叠文件。注意,如果级别-L文件仅重叠级别-(L+1)文件的一部分,则使用级别-(L+1)的整个文件作为压缩的输入,在压缩后将被丢弃。旁白:由于级别-0是特殊的(文件中的文件可能相互重叠),所以我们特别将压缩从级别-0处理到级别-1:级别-0压缩可以选择多个级别-0文件,以防其中一些文件重叠。 压缩合并所选文件的内容以生成级别(L+1)文件序列。在当前输出文件达到目标文件大小(2MB)后,我们切换到生成一个新的级别(L+1)文件。当当前输出文件的关键范围增长到超过10个级别(L+2)文件时,我们还切换到一个新的输出文件。最后一条规则确保了一个级别-(L+1)文件的后续压缩不会从level-(L+2)获取太多数据。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29766453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档