Leveled Compaction Strategy如何确保90%的读取来自一个sstable

时间:2015-04-21 08:10:19

标签: cassandra cql cassandra-2.1

我试图理解Cassandra中的 Leveled Compaction Strategy 如何保证所有读取的90%将来自单个sstable。

来自DataStax Doc:

  

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

1 个答案:

答案 0 :(得分:15)

Cassandra中的LeveledCompactionStrategy(LCS)实现了LevelDB的内部。您可以在LevelDB implementation doc中查看具体的实施细节。

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

  1. 当达到固定(相对较小)的大小限制时,会创建每个sstable。默认情况下,L0获取5MB文件,每个后续级别为10倍大小。 (在L1中你将拥有50MB的数据,L2 500MB,等等。)
  2. 创建Sstables时保证它们不重叠
  3. 当等级填满时,触发压缩并将等级L的稳定提升为等级L + 1。因此,在L1中,你将在~10个文件中拥有50MB,在~100个文件中拥有L2 500MB等。
  4. 以粗体显示相关详细信息,证明90%来自同一文件(sstable)。让我们一起做数学,一切都会变得更加清晰(我希望:)。

    想象一下,你在L0中有键A,B,C,D,E,每个键需要1MB的数据。

    接下来我们插入键F.因为级别0被填充,压缩将在级别1中创建一个带有[A,B,C,D,E]的文件,并且F将保持在级别0中。

    这是L1中1个文件中〜83%的数据

    接下来我们插入G,H,I,J和K.所以L0再次填满,L1用[I,G,H,I,J]得到一个新的sstable。

    到目前为止,我们在L0中有K,[A,B,C,D,E]和[I,G,H,I,J]在L1

    这是L1中~90%的数据:)

    如果我们继续插入键,我们会绕过相同的行为,这就是为什么你从大致相同的文件/ sstable中获得90%的读取。

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

      

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

         

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

    希望这有帮助!