我试图了解如何在卡桑德拉的水平压实战略,以保证90%的阅读将满足从单一的稳定。
来自DataStax医生:
新的马厩被添加到第一层,L0,并立即与L1中的马厩进行压缩。当L1被填满时,额外的马厩被提升到L2。在L1中生成的后续马厩将与与其重叠的L2中的马厩进行压缩。
发布于 2015-04-21 10:58:43
卡桑德拉的LeveledCompactionStrategy (LCS)实现了LevelDB的内部结构。您可以在LevelDB实现文档中检查确切的实现细节。
为了给你一个简单的解释,考虑到以下几点:
以粗体表示的相关细节证明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)获取太多数据。
https://stackoverflow.com/questions/29766453
复制相似问题