平整压实的层数有什么影响?

zengzsys  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(388)

我知道如何平整压实工程在星展银行,如Cassandra,rocksdb等。有些有4级和7级的最大数量。这个数字如何影响压实过程?为什么我不能只有两个级别,第一个级别刷新了mem表数据(文件之间可能有重叠),第二个级别包含不重叠的sst?
如果有任何文件或重复的问题,请重定向。
edit-1:当层数增加时,重复数据会增加。

nfg76nw0

nfg76nw01#

“锡拉”的整平压实工作原理与“Cassandra”和“洛克SDB”的工作原理非常相似(有一些小的区别)。如果你想简单了解一下“锡拉”是如何工作的,以及为什么,我建议你阅读我的博客文章https://www.scylladb.com/2018/01/31/compaction-series-leveled-compaction/.
关于为什么两个级别(最近刷新的sstables的l0,不相交范围sstables的ln)不够的具体问题是一个非常好的问题:
主要问题是,一个flushed memtable(l0中的sstable)包含一个随机的写操作集合,常常会与ln中的所有sstable相交。这意味着每次刷新一个新的memtable时,都要重写整个数据库,结果会导致超大量的写放大,这是完全不可接受的。
一种显著减少这种写放大(但可能还不够)的方法是引入一个级联的中间级l0,l1,…,ln。最终的结果是,我们得到了l(n-1),它是ln大小的1/10,我们将l(n-1)-而不是单个sstable-合并到ln中。这是分级压缩策略(lcs)在您提到的所有系统中使用的方法。
另一种完全不同的方法不是将单个sstable合并到ln中,而是尝试先收集大量数据,然后再将其合并到ln中。我们不能只在l0中收集1000个表,因为这样会使读取速度非常慢。相反,要收集如此大量的数据,可以在l0中使用大小分层压缩(stcs)。换句话说,这种方法是具有两个“级别”的stc和lc的“混合”:l0在新的sstables上使用stc,ln包含一系列sstables(范围不相交的sstables)。当l0达到ln的十分之一时,l0被压缩成ln。这种混合方法可能比lcs具有更低的写放大,但由于大多数数据都在run-in ln中,因此它将具有与lcs相同的低空间和读放大。据我所知,上述数据库(scylla、cassandra或rocksdb)都不支持这种“混合”压缩。

vlju58qv

vlju58qv2#

lcs的出现解决了stcs的空间放大问题。它还减少了读取放大(每个读取请求所需的平均磁盘读取次数)。
分级压缩将小表(“碎片”)分为几个级别:
级别0(l0)是最近从memtables刷新的新sstables。随着sstables数量的增长(读取速度减慢),我们的目标是将sstables从这个级别移到下一个级别。其他级别(l1、l2、l3等)中的每一个都是一次按指数递增的运行:l1是10个SSTABLE的运行,l2是100个SSTABLE的运行,l3是1000个SSTABLE的运行,依此类推(因子10是scylla和apache cassandra中的默认设置)。
在解决空间放大问题或至少显著改善空间放大问题时,lcs使另一个问题写放大变得更糟。
“write amplification”是指对于新刷新的sstable数据的每一字节,我们必须写入磁盘的字节数。写放大率总是高于1.0,因为我们将每一段数据写入提交日志,然后再将其写入一个sstable,然后每次压缩都涉及这段数据并将其复制到一个新的sstable,这是另一次写操作。
请在此处阅读更多信息:
https://www.scylladb.com/2018/01/31/compaction-series-leveled-compaction/
https://docs.scylladb.com/kb/compaction/
https://docs.scylladb.com/architecture/compaction/compaction-strategies/

相关问题