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实施文档中查看确切的实现细节.
为了给您一个简单的解释,请考虑以下几点:
粗体是相关细节,证明从同一文件(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)中获取太多数据.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4667 次 |
| 最近记录: |