存算分离集群 Compaction
本文介绍如何在 StarRocks 存算分离集群中管理 Compaction。
概述
在 StarRocks 中,每次导入都会生成一个新的版本。Compaction 将不同版本的数据文件合并为更大的文件,从而减少小文件的数量并提高查询效率。
Compaction Score
介绍
Compaction Score 反映了分区的数据文件合并状态。分数越高,表示该分区的数据文件合并程度越低,即该分区有更多版本的数据文件需要合并。FE 为每个分区维护 Compaction Score 信息,包括 Max Compaction Score (即这个分区中 Compaction Score 最高的 Tablet 的分数)。当 Partition 的 Max Compaction Score 小于 FE 参数 lake_compaction_score_selector_min_score(默认10),则这个 Partition 的所有 Compaction 已经结束。当 Partition 的 Max Compaction Score 超 过 100,就可以认为是不太健康的 Compaction 状态。当这个分区的 Max Compaction Score 超过 FE 参数 lake_ingest_slowdown_threshold(默认100),系统会开始减缓这个分区的数据导入事务的提交速度,当超过 FE 参数 lake_compaction_score_upper_bound(默认2000) 时,系统会拒绝这个分区的数据导入事务。
计算规则
大多数情况下,一个数据文件对应的 Compaction Score 为 1,也就是说,假设一个分区只有一个 Tablet,如果第一次数据导入这个 Tablet 内产生了 10 个数据文件,那么这个分区的 Max Compaction Score 就是 10,并且一个事务在一个 Tablet 内产生的所有数据文件被称作是一个 Rowset。
除了以上的分数计算规则,实际的 Compaction Score 计算时还会把这个 Tablet 的所有 Rowset 按照大小规则进行分组,然后以 Score 最大的那一组作为其 Compaction Score。
假设一个 Tablet 经历了 7 次导入,生成了 7 个 Rowset,数据大小分别是 100 MB、100 MB、100 MB、10 MB、10 MB、10 MB、10 MB,那么计算时,首先会将其中三个 100 MB 分为一组,四个 10 MB 分为另一组,然后分别统计两个组内的数据文件数量,以数据文件多的那个组的 Compaction Score 作为这个 Tablet 的 Compaction Score。如果 Compaction Score 满足要求,后续进行 Compaction 时,会挑选分数最高的一组 Rowset 进行 Compaction。比如在这个例子里,如果是第二组 Compaction Score 更高,那么经过 Compaction,这个 Tablet 的 Rowset 分布会变成 100 MB、100 MB、100 MB、40 MB。