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

Cha*_*ity 7 cql cassandra cassandra-2.1

我试图理解Cassandra中的Leveled Compaction Strategy如何保证所有读取的90%将从单个sstable中得到满足.

来自DataStax Doc:

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

Luí*_*eia 17

Cassandra中的LeveledCompactionStrategy(LCS)实现了LevelDB的内部.您可以在LevelDB实施文档中查看确切的实现细节.

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

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

粗体是相关细节,证明从同一文件(sstable)读取90%是合理的.让我们一起做数学,一切都会变得更加清晰(我希望:)

想象一下,你在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得到一个新的sstable与[I,G,H,I,J].

到目前为止,我们在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)中获取太多数据.

希望这可以帮助!