如果是prepicked compaction,那么就将prepicked_compaction->compaction作为要做的compaction任务。 DBImpl::BackgroundCompaction中,取出compaction任务后: 如果是最底层的compaction,而且不是prepicked compaction,那么就把priority改成BOTTOM,并且设置成prepicked_compaction,然后scheduleDBImpl::BGWorkBottomCompaction,这个函数...
具体数据如下图,超出这个阈值之后就会触发compaction。 具体流程 上文提到compaction分为minor和major compaction。Minor compaction是当L0的文件数目超过level0_file_num_compaction_trigger的参数就会触发。通常来说因为L0的文件极大概率是相互重叠的,因为大部分情况所有的L0文件都会被合并到L1中。 Minor compaction合并...
Rocksdb通过max_subcompactions来控制sub-compaction的数量。max_subcompaction默认是1,也就是关闭的状态。需要注意的是在Round Robin的leveled compaction下,subcompaction是自动开启的,从上面的代码中也可以看到。 Manual Compaction(手动compaction) Rocksdb通过提供手动compaction的方式来允许用户进行更灵活的优化。调用接口...
数据会在 MemTable 中写入一条delete 标记。 在后续的 Compaction 过程中,带有删除标记的数据才会被真正移除。 修改就是追加一条新数据,版本比之前的新 三、读优化机制 1. Block Cache RocksDB 使用Block Cache缓存最近访问的热数据块,减少磁盘 IO。 2. Bloom Filter 每一层 SST 文件配备Bloom Filter: 快速判断...
BackgroundCompaction这个函数比较长,我们主要分析主干,细枝末节先放弃。主流程: 从全局队列,compaction_queue_,获取等待做compact的cf 调用PickCompaction,用于挑选需要做compaction的文件,具体的信息记录在Compaction对象中 尽管当前的compact未开始执行,但是从一个level挑选一些SST文件做compact后,此时该level的score就发生了...
RocksDB的混合compaction策略 由于上述两种compaction策略都有各自的优缺点,所以RocksDB在L1层及以上采用leveled compaction,而在L0层采用size-tiered compaction。下面分别来看看。 leveled compaction 当L0层的文件数目达到level0_file_num_compaction_trigger阈值时,就会触发L0层SST合并到L1。
rocksdb中通过一个任务队列维护compaction任务流,通过判断某个level是否满足compaction条件来加入队列,然后从队列中获取任务来进行compact。compaction的主要流程如下: 1.首先找score最高的level,如果level的score>1,则选择从这个level进行compaction 2.根据一定的策略,从level中选择一个sst文件进行compact,对于level0,由于...
RocksDB仅支持L0到L1的基于子压缩的并行化。要启用它,可以将max_subcompactions设置为大于1。然后,RocksDB将尝试对范围进行分区,并使用多个线程来执行它: Compaction挑选 当多个Level触发Compaction机制时,RocksDB需要决定先对哪个Level做Compaction。为了区分优先级,对每个Level计算相应的Score...
根据前面的问题描述,我们深入分析了RocksDB Compaction的特点,提出了两点改进思路:根据以上分析,我们最终将扩容分为了3个大的阶段:整体流程如下图所示:经过上述扩容方式的改进,目前线上WTable集群已经可以进行较高速的扩容,比如50~100MB/s,并且在整个流程中不会对线上服务有任何影响。在制定方案...