#database/olap - **数据版本的产生** - 对于新增Rowset,起始版本和终止版本相同,表示为 \[6-6\]、\[7-7\] - 多个Rowset经过 Compaction 形成一个大的 Rowset,起始版本和终止版本为多个版本的并集,如 [6-6]、[7-7]、[8-8] 合并后变成 [6-8] - **compaction类型** Doris 中有两种 Compaction 操作: - Base Compaction(BC) - Cumulative Compaction(CC) BC 是将基线数据版本(以0为起始版本的数据)和增量数据版本合并的过程,而CC是增量数据间的合并过程。 BC 和 CC 之间的分界线成为 Cumulative Point(CP),这是一个动态变化的版本号。比CP小的数据版本会只会触发 BC,而比CP大的数据版本,只会触发CC。 <p align="center"> <img src="https://mmbiz.qpic.cn/mmbiz_png/eGOhXuI8cBZr9U7fY7HHCrGUJAKFVRXJeunq98iaIhiaYG87iapkzOY4TQquqW3iayH2ScJRoUKicGvJAnvecBvAozQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"> </p> - **数据分片选择** 一个自然的想法,就是每次都选择数据版本最多的数据分片进行 Compaction。 Doris 在选择数据分片时还引入了 “读取频率” 的因素。“读取频率” 和 “版本数量” 会根据各自的权重,综合计算出一个 Compaction 分数,分数越高的分片,优先做 Compaction。 这两个因素的权重由以下 BE 参数控制(取值越大,权重越高): - compaction_tablet_scan_frequency_factor:“读取频率” 的权重值,默认为 0。 - compaction_tablet_compaction_score_factor:“版本数量” 的权重,默认为 1。 Compaction 是一个 生产者-消费者 模型。由一个生产者线程负责选择需要做 Compaction 的数据分片,而多个消费者负责执行 Compaction 操作。 因为 Base Compaction 和 Cumulative Compaction 是不同类型的任务,因此目前的策略是每生成 9 个 CC 任务,生成一个 BC 任务 Compaction限制: - Doris 限制了每个磁盘上能够同时进行的 Compaction 任务数量,以及节点整体的任务数量。 - 任务配额限制:每个 Compaction 任务都有一个配额,其数值就是任务涉及的数据版本数量。当正在运行的任务配额总和超过配置后,新的任务将被拒绝。 - **数据版本选择策略** 一个 Compaction 任务对应的是一个数据分片(Tablet)。消费线程拿到一个 Compaction 任务后,会根据 Compaction 的任务类型,选择 tablet 中合适的数据版本(Rowset)进行数据合并。 - **Base Compaction** 会选取所有版本在 0 到 CP之间的 rowset,然后根据以下几个配置参数,判断是否启动一个 BC 任务: - **base_compaction_num_cumulative_deltas**:一次 BC 任务最小版本数量限制。默认为5。该参数主要为了避免过多 BC 任务。当数据版本数量较少时,BC 是没有必要的。 - **base_compaction_interval_seconds_since_last_operation**:当 Doris 发现一个 tablet 长时间没有执行过 BC 任务时,也会触发 BC 任务。 - **Cumulative Compaction** CC 任务只会选取版本比 CP 大的数据版本。其本身的选取策略也比较简单,即从 CP 版本开始,依次向后选取数据版本。 控制参数: - min_cumulative_compaction_num_singleton_deltas:一次 CC 任务最少的版本数量限制 - max_cumulative_compaction_num_singleton_deltas:一次 CC 任务最大的版本数量限制 - cumulative_size_based_compaction_lower_size_mbytes:一次 CC 任务最少的数据量 简单来说,默认配置下,就是从 CP 版本开始往后选取 rowset。最少选5个,最多选 1000 个,然后判断数据量是否大于阈值即可。 CC 任务还有一个重要步骤,就是在合并任务结束后,设置新的 Cumulative Point。 一个 CC 任务生成的 rowset 的晋升原则,是其数据大小和基线数据的大小在 “同一量级”。 - Delete灾难 删除版本只能通过 Base Compaction 任务处理。导致 Compaction 进度缓慢。 # 引用: [Doris 最佳实践-Compaction调优(1)](https://mp.weixin.qq.com/s?__biz=Mzg5MDEyODc1OA==&mid=2247485874&idx=3&sn=85dc2a8e4ae5149e6ac63966dc8bbed7&chksm=cfe019abf89790bdb74c22c8f8fc57906f0be917a9bbd303179a1861ee6b38cb2f2df77f9a7c&scene=178&cur_album_id=1507526553017090049#rd) [Doris 最佳实践-Compaction调优(2)](https://mp.weixin.qq.com/s?__biz=Mzg5MDEyODc1OA==&mid=2247485874&idx=2&sn=36b0734133468b577485af70c99cdf82&chksm=cfe019abf89790bd3c5ffdcb12d032a528cea5d81194314ce21ba405caea607ae0c35a95de4e&scene=178&cur_album_id=1507526553017090049#rd) [Doris 最佳实践-Compaction调优(3)](https://mp.weixin.qq.com/s?__biz=Mzg5MDEyODc1OA==&mid=2247485874&idx=1&sn=a4e197d951bc72372856f6776c4460ee&chksm=cfe019abf89790bd89122c95a64a6f2ea62edfb5da637e844c6df54714ad9e73c6feb3a69c05&scene=178&cur_album_id=1507526553017090049#rd) [【Doris全面解析】Doris Compaction机制解析](https://mp.weixin.qq.com/s?__biz=Mzg5MDEyODc1OA==&mid=2247485136&idx=1&sn=a10850a61f2cb6af42484ba8250566b5&chksm=cfe016c9f8979fdf100776d9103a7960a524e5f16b9ddc6220c0f2efa84661aaa95a9958acff&scene=21#wechat_redirect)