当前位置: 代码迷 >> 综合 >> Doris Compaction机制总结
  详细解决方案

Doris Compaction机制总结

热度:20   发布时间:2023-11-28 00:57:51.0

1、参考文档

Doris 最佳实践-Compaction调优(1)
Doris 最佳实践-Compaction调优(2)
【Doris全面解析】Doris Compaction机制解析

顺序读完这三篇文章,就能对Doris的compaction机制很熟悉了

2、总结

2.1、读写方式

2.1.1、写入

Doris数据写入模型使用了LSM-Tree(随机写变为顺序写,面向写优化),数据追加的方式写入磁盘

2.1.2、读取

读逻辑上,需要通过Merge-on-Read方式

2.2.3、compaction目的

  • 一是避免在读取时大量的 Merge 操作
  • 二是避免大量的数据版本导致的随机IO

2.2、Compaction优点

  • 数据更加有序
  • 消除数据变更
  • 增加数据聚合度

2.3、Compaction 的问题

1、compaction速度低于写入速度
2、写放大问题,过多的 Compaction 会占用大量的磁盘IO资源

合理的设置表的分区、分桶和副本数量,避免过多的分片,可以降低Compaction的开销。

2.4、数据版本的产生

一个 Tablet 是由多个Rowset 组成的。
每个 Rowset 都有一个对应的起始版本和终止版本。
对于新增Rowset,起始版本和终止版本相同,表示为 [6-6]、[7-7] 等。

多个Rowset经过 Compaction 形成一个大的 Rowset,起始版本和终止版本为多个版本的并集
如 [6-6]、[7-7]、[8-8] 合并后变成 [6-8]。

2.5、Base & Cumulative Compaction

如果只有 Base Compaction,则每次增量数据都要和全量的基线数据合并,写放大问题会非常严重,并且每次 Compaction 都相当耗时。

在合理范围内,尽量减少 Base Compaction 操作。

2.6、数据分片选择策略

tablet的“读取频率” 和 “版本数量” 会根据各自的权重,综合计算出一个 Compaction 分数,分数越高的分片,优先做 Compaction。

  • compaction_tablet_scan_frequency_factor:“读取频率” 的权重值,默认为 0。
  • compaction_tablet_compaction_score_factor:“版本数量” 的权重,默认为 1。

“读取频率” 的权重值默认为0,即默认仅考虑 “版本数量” 这个因素。

2.7、Compaction 是一个 生产者-消费者 模型

一个生产者线程负责选择需要做 Compaction 的数据分片
而多个消费者负责执行 Compaction 操作

2.7.1、生产者

generate_compaction_tasks_min_interval_ms
每生产一轮compaction任务,producer线程会休眠10ms。

每生成 9 个 CC 任务,生成一个 BC 任务
cumulative_compaction_rounds_for_each_base_compaction_round:多少个CC任务后生成一个BC任务。

2.7.2、消费者

生产者线程产生的任务会被提交到消费者线程池。
因为 Compaction 是一个IO密集型的任务,为了保证 Compaction 任务不会过多的占用IO资源,

Doris 限制了每个磁盘上能够同时进行的 Compaction 任务数量,以及节点整体的任务数量

compaction_task_num_per_disk:每个磁盘上的任务数,默认为2。该参数必须大于等于2,以保证 BC 和 CC 任务各自至少有一个线程。

max_compaction_threads:消费者线程,即Compaction线程的总数。默认为 10

Compaction 任务同时也是一个内存密集型任务,因为其本质是一个多路归并排序的过程,每一路是一个数据版本
如果一个 Compaction 任务涉及的数据版本很多,则会占用更多的内存,如果仅限制任务数,而不考虑任务的内存开销,则有可能导致系统内存超限
因此,Doris 在上述任务个数限制之外,还增加了一个任务配额限制(Permission机制):

total_permits_for_compaction_score:Compaction 任务配额,默认 10000

compaction_task_num_per_disk
max_compaction_threads
total_permits_for_compaction_score

三个配置共同决定了节点所能承受的 Compaction 任务数量。

2.8、 数据版本选择策略

2.8.1、BC

base_compaction_num_cumulative_deltas:
一次 BC 任务最小版本数量限制。默认为5。该参数主要为了避免过多 BC 任务。当数据版本数量较少时,BC 是没有必要的

base_compaction_interval_seconds_since_last_operation
当 Doris 发现一个 tablet 长时间没有执行过 BC 任务时,也会触发 BC 任务。这个参数就是控制这个时间的,默认是86400,单位是

2.8.2、CC

目前可供选择的cumulative compaction策略有两种:
1、num_based cumulative compaction(待废弃)
2、size_based cumulative compaction(默认)

cumulative compaction的策略选择可以通过参数
cumulative_compaction_policy进行配置(默认为size_based)。

  • num_based cumulative compaction是基于rowset的文件数量进行compaction的选择,该策略会在后面的版本中被丢弃。

  • size_based cumulative compaction策略通过计算每个rowset的大小来决定compaction的选择,可以显著地减少写放大的系数。

相关参数
min_cumulative_compaction_num_singleton_deltas
一次 CC 任务最少的版本数量限制,默认是5

max_cumulative_compaction_num_singleton_deltas
一次 CC 任务最大的版本数量限制,默认1000

cumulative_size_based_compaction_lower_size_mbytes
一次 CC 任务最少的数据量,和min_cumulative_compaction_num_singleton_delta 同时(&&关系)判断。默认是 64,单位是 MB。

简单来说,默认配置下,就是从 CP 版本开始往后选取 rowset。最少选5个,最多选 1000 个,然后判断数据量是否大于阈值即可。

2.8.3、设置新的CP

CC任务合并结束后,CC任务还要设置新的CP
CC 任务合并完成后,会产生一个合并后的新的数据版本,
而我们要做的就是判断这个新的数据版是 “晋升” 到 BC 任务区,还是依然保留在 CC 任务区

CP 只会增加,不会减少。
以下参数决定了是否更新 CP:
cumulative_size_based_promotion_ratio:晋升比率。默认 0.05。

cumulative_size_based_promotion_min_size_mbytes:最小晋升大小,默认 64,单位 MB。

cumulative_size_based_promotion_size_mbytes:最大晋升大小,默认 1024,单位 MB。

2.9、其他 Compaction 参数和注意事项

disable_auto_compaction:默认为 false,修改为 true 则会禁止 Compaction 操作。
该参数仅在一些调试情况,或者 compaction 异常需要临时关闭的情况下才需使用。

删除版本只能通过 Base Compaction 任务处理。
因此在在遇到删除版本时,Cumulative Point 会强制增加,将删除版本移动到 BC 任务区。
因此数据导入和删除交替发生的场景通常会导致 Compaction 灾难。
在这种情况下,CC 任务几乎不会被触发(因为CC任务只能选择一个版本,而无法处理删除版本)

3、相关参数总结


#选择tablet进行compaction时,计算 tablet score 的公式中 tablet scan frequency 的权重
compaction_tablet_scan_frequency_factor 0#选择tablet进行compaction时,计算 tablet score 的公式中 compaction score的权重。
compaction_tablet_compaction_score_factor 1#每生产一轮compaction任务,producer线程会休眠10ms。
generate_compaction_tasks_min_interval_ms 10#Compaction任务的生产者每次连续生产多少轮cumulative compaction任务后生产一轮base compaction。
cumulative_compaction_rounds_for_each_base_compaction_round 9#每个磁盘可以并发执行的compaction任务数量。
compaction_task_num_per_disk 2#Compaction线程池中线程数量的最大值。
max_compaction_threads#被所有的compaction任务所能持有的 “permits” 上限,用来限制compaction占用的内存。
total_permits_for_compaction_score 10000#Cumulative文件数目要达到的限制,达到这个限制之后会触发BaseCompaction
base_compaction_num_cumulative_deltas 5#BaseCompaction触发条件之一:上一次BaseCompaction距今的间隔
base_compaction_interval_seconds_since_last_operation 86400#cumulative compaction策略:最小增量文件的数量
min_cumulative_compaction_num_singleton_deltas 5#cumulative compaction策略:最大增量文件的数量
max_cumulative_compaction_num_singleton_deltas 100#在size_based策略下,cumulative compaction进行合并时,选出的要进行合并的rowset的总磁盘大小大于此配置时,
#才按级别策略划分合并。小于这个配置时,直接执行合并。单位是m字节。
#简单来说,默认配置下,就是从 CP 版本开始往后选取 rowset。最少选5个,最多选 1000 个,然后判断数据量是否大于阈值即可。
cumulative_size_based_compaction_lower_size_mbytes 64m#(CC输出的rowset大小)/(BC所有rowset大小)晋升比率(这是一个量级)。
cumulative_size_based_promotion_ratio 0.05#CC输出的rowset大小最小阈值
cumulative_size_based_promotion_min_size_mbytes:最小晋升大小,默认 64,单位 MB。#CC输出的rowset大小最大阈值
cumulative_size_based_promotion_size_mbytes:最大晋升大小,默认 1024,单位 MB。