背景知识:Doris中compaction分为两种:BASE_COMPACTION 和 CUMULATIVE_COMPACTION
1、首先从 olap_server.cpp 中 start_bg_threads 开始启动各种流程
compaction入口:StorageEngine::_compaction_tasks_producer_callback()
如果没有禁止 disable_auto_compaction 则每进行 cumulative_compaction_rounds_for_each_base_compaction_round=9(默认) 次 cumulative_compaction之后,进行一次base_compaction
2、compaction是按照磁盘数量为单位的,每块磁盘进行自己的compaction,每块磁盘可以进行的compaction数量由 compaction_task_num_per_disk 控制
3、在进行compaction之前,先判断磁盘剩余容量,两个条件:磁盘使用百分比不超过storage_flood_stage_usage_percent && 磁盘剩余容量大于 storage_flood_stage_left_capacity_bytes (默认1073741824 1G)
4、再来看table最关键的选取策略: find_best_tablet_to_compaction
遍历所有的tablet,过滤条件如下:
1、已经在compaction队列中的
2、当前有tablet下存在alter_task,并且alter_task状态是在进行中,并且当前tablet创建时间大于alter_task中的tablet创建时间 (此种情况注释中认为是刚创建的、schema改变中、rollup中) 不明白talter_task中的tablet和原始table有什么区别,
还要看下alter_task的逻辑,我猜是在上述三种情况下创建的tmp_tablet,处理完成后进行rename TODO
3、当前tablet状态为not reday
4、tablet 路径hash和dir hash不一致 || 当前磁盘路径不可用 || 当前tablet还没有init || 不能进行 compaction (选取最大的rowset version 然后从 0 version开始进行bfs,判断是否能够连通)注释给出的意思是如果tablet在做schema change
则通过bfs判断连通来判断是否schema变换完成 不明白rowset version的生成逻辑,所以这里为什么bfs连通就表示schema完成 TODO
5、上次compaction失败时间距离现在间隔较短 通过min_compaction_failure_interval_sec参数来控制 默认10分钟
6、当前tablet没有拿到锁
过滤掉上述不满足条件的tablet后,对当前tablet按照不同的compaction类型计算得分,其中对于得分计算策略又分为两种 size_based 和 num_based,好吧,其实基于名字也能看的出来这两种是干啥的。默认是size_based。
5、那我们先来看下size_based策略下如何计算得分
cumulative_compaction + size_based 策略:遍历rowset的mate信息,根据staet version == 0 判断是否含有base_rowset。如果没有base_rowset说明tablet可能在做alter table则得分为0。在包含base_rowset的情况下,遍历cumulative_point右边的rowset
然后累计每个rouset的得分,如果rowset是非重叠则分数为1,否则分数为segment数量。(非重叠的判断:segment数量大于1,并且start version = end version 说明没有进行过合并)
在这里还有一个晋升的机制,说的是当前tablet下所有的rowset size超过了当前base rowset的一定比例之后,说明当前rowset需要被合并。相关参数是 cumulative_size_based_promotion_min_size_mbytes、
cumulative_size_based_promotion_ratio、cumulative_size_based_promotion_size_mbytes
在这里还有一个rowset选取的机制,也就是说,此次compaction要选择哪些rowset呢?当所有rowset的size和单个rowset不在一个数量级别上的时候,当前rowset才会被算作分数。相关参数为 cumulative_size_based_compaction_lower_size_mbytes=64M 和
cumulative_size_based_promotion_size_mbytes
这里的意思是这样的:默认的level有512M、256M、128M、64M (根据上述两个参数生成),如果说当前有5个rowset,大小分别为70M、1M、1M、1M、1M 此时total_size=74M,对于第一个rowset来说,cur_level=128M,remain_level=64M,两者不在同一个level
在合并的时候就不会选取第一个rowset(第一个rowset不会计入得分),因为目的是为了合并多个rowset,并且尽可能少的合并次数,如果多次合并的话,写放大就会增加。那么此次的计分只会统计 后面四个rowset。
base_compaction + size_based 策略:rowset积分规则和上面相同:如果rowset是非重叠则分数为1,否则分数为segment数量。(非重叠的判断:segment数量大于1,并且start version = end version 说明没有进行过合并),但是base_compaction是统计compaction_point左边
的rowset,cumulative_compaction是统计右边的。
6、说完了每个tablet的得分计算之后,我们最后来看下最后得分计算公式: compaction_tablet_scan_frequency_factor * scan_frequency + compaction_tablet_compaction_score_factor * current_compaction_score
两个系数以及tablet scan频率和tablet得分计算最终分数,然后选出得分最高的tablet,将得分情况写入metric。将best tablet加入compaction队列。
上面说的是选择tablet的流程,那么队列中的tablet是怎么处理,进行compaction的呢?(我吐了啊,明明是自己人写的,注释就不能整中文的吗)
首先是准备阶段,对于cumulative compaction:再次检查tablet是否正常,然后获取cumulative lock,如果没获取到,说明已经在进行compaction,
1、计算 cumulative point,这个计算只会处理一次,后续的point是在compaction时更新。通过rowset meta文件,对现在的rowset进行排序,要求begin rowset必须为0(上面提过为什么为0) ,cumulative point选择有两个规则:a、第一个重叠segment或者是第一个 singleton_delta(start version=end version) b、第一个不满足promotion的rowset(因为如果满足promotion的话,该rowset会归到base compa中,所以cumulative point应该在右边)。 如果条件a和b都不满足的话,说明当前rowset都是base compaction,则cumulative point 将大于rowset下的所有version。
2、选择rowset进行compaction
1、pick_rowset_candidate 选出候选的rowset (对于cumulative compaction 规则为:大于 cumulative point,并且创建时间大于 cumulative_compaction_skip_window_seconds 间隔)
2、因为有保护时间的存在,所以上面选出的rowset集合可能version不是连续的(比如刚刚进行过合并的rowset,这次就不会再选择),所以从候选rowset中选出连续最长的序列。
3、然后从最长序列中再次选出一批rowset,这里的选取规则和上面的分数计算一致,当前rowset的数量级需要达到所有rowset的量级相同level。
4、最终选出的rowset可能为空,说明当前rowset的得分不足以进行compaction,但是为了避免等待很久之后还是得分不足,在等待足够久的时间后,compaction可以直接进行。
这里所说的都是cumulative compaction。base compaction流程如下 :pick_rowset_candidate 选出候选的rowset (规则为:小于 cumulative point),然后下面三种情况可以进行compaction
1、rowset数量大于 base_compaction_num_cumulative_deltas (积累了足够做的需要做base compaction的 rowset)
2、base rowset的大小和非base rowset的大小比例超过了 base_cumulative_delta_ratio
3、上次base compaction的时间距离此次超过了时间间隔。base_compaction_interval_seconds_since_last_operation
上面都是解析阶段,解析完之后,根据sorce得分申请需要的令牌数量,申请到令牌才可以执行。至此,compaction规则解析就结束了。
1524

被折叠的 条评论
为什么被折叠?



