分层压缩策略如何确保90%的读取来自一个稳定器

问题描述 投票:7回答:1

我试图了解Cassandra中的Leveled Compacting Strategy的工作原理,以确保单个sstable可以满足所有读取的90%。

从DataStax文档:

新的稳定表被添加到第一级L0,并立即与L1中的稳定表一起压缩。当L1填满时,额外的稳定级将提升为L2。 L1中生成的后续稳定表将与L2中与其重叠的稳定表一起压缩。

cassandra cql cassandra-2.1
1个回答
17
投票
Cassandra中的

LeveledCompactionStrategy(LCS)实现了LevelDB的内部。您可以在LevelDB implementation doc中查看确切的实现详细信息。

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

  1. 当达到固定(相对较小)的大小限制时,将创建每个sstable。默认情况下,L0获取5MB的文件文件,并且每个后续级别是大小的10倍。 (在L1中,您将拥有50MB的数据,L2中将有500MB的数据,依此类推)。
  2. 稳定表是用保证它们不重叠的
  3. 创建的
  4. [级别填满后,将触发压实,并且级别L的马s将提升为级别L + 1。因此,在L1中,约10个文件中有50MB,L2中约100个文件中有500MB,等等。

粗体字是相关的详细信息,可证明从同一文件中进行90%读取是合理的(稳定)。让我们一起做数学,一切都会变得更加清晰(我希望:)

假设您在L0中有键A,B,C,D,E,每个键占用1MB的数据。

接下来,我们插入键F。因为填充了0级,压缩将创建一个文件,该文件的级别为[A,B,C,D,E],而F将保持在0级。

大约是L1中1个文件中的数据的83%

[接下来,我们插入G,H,I,J和K。因此L0再次填满,L1得到一个新的[I,G,H,I,J]稳定值。

[现在,L0中有K,L1中有[A,B,C,D,E]和[I,G,H,I,J]中的K]]

这大约是L1中数据的90%

:)

如果继续插入密钥,我们将获得相同的行为,因此,您从大致相同的文件/稳定表中获得90%的读取结果。

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

当级别L的大小超过其限制时,我们将其压缩在后台线程中。压缩从级别L中选择一个文件,并从下一级别L + 1中选择所有重叠的文件。请注意,如果级别L文件仅与级别(L + 1)文件的一部分重叠,则级别(L + 1)的整个文件将用作压缩的输入,并且在压缩后将被丢弃。撇开:因为0级是特殊的(文件中的文件可能会相互重叠),所以我们特别处理从0级到1级的压缩:0级压缩可能会选择多个0级文件,以防其中一些文件彼此重叠。

压缩合并选取的文件的内容以生成一系列(-L + 1)个文件。当前输出文件达到目标文件大小(2MB)之后,我们切换到生成新的level-(L + 1)文件。当当前输出文件的键范围增长到足以重叠超过十个级别(L + 2)文件时,我们还将切换到新的输出文件。最后一条规则可确保以后对级别(L + 1)文件的压缩不会从级别((L + 2))中获取过多数据。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.