海山数据库(He3DB)技术干货:StarRocks Compaction机制解析及性能调优

以StarRocks 新发布的3.2.1版本为基准,剖析了Compaction任务管理器设计架构,分析了基于Size-Tiered挑选rowset进行Compaction的策略,介绍了Compaction的调度执行流程。最后,针对两种常见问题场景,给出Compaction性能调优思考。

一、引言

为了充分发挥磁盘连续写性能优势,StarRocks以 Append-only 的方式将数据写入内存,达到阈值后Flush为磁盘文件,再结合 Compaction 机制将多个小文件进行多路归并排序形成新的文件,最终实现数据的高效读。数据表会按照分区和分桶规则,切分成若干个数据分片(Tablet),存储在不同BE节点上。当用户写入一批数据时,BE节点在相关Tablet中会形成一个 rowset。一个Tablet是由多个rowset组成的。每个rowset都有一个对应的起始版本和终止版本。对于新增rowset,起始版本和终止版本相同,表示为[2-2]。多个rowset经过Compaction形成一个大的rowset,起始版本和终止版本为多个版本的并集,如[2-2]、[3-3]、[4-4]合并后变成[2-4]。

Compaction分为两种类型:Base Compaction和Cumulative Compaction。

Base compaction会将rowset合入到start version为0的基线数据版本中,同时将标记为删除的行的删掉,以减少数据占用的空间,是一种开销较大的Compaction操作。而Cumulative Compaction 先对增量数据进行合并,当增量数据合并后的大小达到一定阈值后,再和基线数据合并。

二、Compaction任务管理器架构

在StarRocks新发布的3.2.1版本中,Compaction架构已经发生了很大变化。

首先,Compaction机制由即时创建工作线程转变为生产(Check)-消费(Schedule)模型。这种机制在Compaction频率不高的场景下,剔除了那些闲置的工作线程,节约了资源。其次,挑选rowset进行Compaction的策略也升级了。因此,本文以新架构为基准进行介绍。

图 1 Compaction任务管理器架构

Check线程周期性从该BE管理的Tablet中挑选出一批(batch_size)需要Compaction的Tablet,将其包装成CompactionCandidate,并提交到有序集合_compaction_candidates中。Schedule线程定时获取队列中Score最高的任务进行Compaction条件判断。每次有新的Compaction任务满足条件,并且当前运行的Compaction任务数量没有达到最大Compaction任务数,就启动一个线程去处理Compaction。如图1所示为Compaction任务管理器架构。

三、基于Size-Tiered挑选rowset的策略

上述任务管理器是如何判断Tablet需要Compaction?挑选Tablet中哪些rowset进行Compaction?StarRocks使用了两个策略。一个是default策略,另一个是Size-Tiered策略。Default策略实质是统计rowset中segment文件数量,挑选出1000个segment文件进行合并。这个策略会导致Cumulative Compaction任务执行时间长,占用资源多,因此在新版本中已经不再使用。Size-Tiered策略是将rowset大小分层,结合影响因素计算出Rowset的Compaction的Score。Score分数越高,rowset越容易被执行Compaction。

表1中的三个配置作用于这个Size-Tiered策略。在该策略下,rowset根据大小分为7层,相邻两层之间大小差距5倍,每一层都会保留1个rowset。默认配置下7个层级大小依次128K、640K、3M、15M、78M、390M、1.9G。

size_tiered_min_level_size

128K

size_tiered_level_multiple

5

size_tiered_level_num

7

(表1 Size_Tiered策略相关配置项)

影响Score的因素有五个,分别为Tablet模型、rowsets大小、segment 数量、Tablet Version数量和rowsets level。在Tablet模型因素中,明细模型因为没有计算逻辑,因此在其他因素相同情况下,rowset越大,Compaction优先级越高。聚合模型和更新模型在segment数量多情况下,Compaction后文件大小会减少,读效率会提高。因此,这两个模型在计算Score时增加了segment数量影响权重。在考虑rowset level因素对Score的影响时,level越低表示压缩的数据量越小,Compaction执行优先级越高。在Version数据达到Tablet最大Version时,数据就写不进去,BE进而报错。因此在处理Version 数量时,一旦达到最大版本数的90%时,就说明需要Compaction,在计算Score时也是最为激进。

图2 Score影响因素

Score分数最高的的rowsets,也并不是一定能提交到有序集合中,需要满足segment数量原则,才能成为预备Compaction任务入队。此举也是为了避免频繁触发Compaction影响集群性能而被引入。新引入的Size-Tiered策略相比较于default策略,将Tablet中rowset分为7层,每次挑选出同一层内的rowset进行Compaction。Cumulative Compaction会执行多次,每次逐步向上一层传递。这种策略减少了Base Compaction的触发次数,提高Compaction效率。

四、Compaction调度执行流程

Schedule线程周期性获取_compaction_candidates集合中Score最高的candidate并对它进行检查。检查的逻辑包括Tablet状态校验、Compaction锁状态、每个磁盘上运行的任务数限制和任务失败间隔约束等四个。

在检查不通过情况下,重新获取candidate,直到检查通过为止。接下来是决策Compaction执行方式。如果segment数量较少且待合并的列数于每组最大数,那么就使用行合并。最后就是初始化Compaction任务并提交到工作线程执行。根据挑选出的rowsets按版本升序排序后第一个版本号是否是0,决定此次任务的类型。如果是0,任务就是Base Compaction,否则是Cumulative Compaction。虽然任务分为两种类型,但是执行流程却相同。

执行流程主要分为Shortcut Compaction、Data Compaction、Valid Compaction和Commit Compaction等四个步骤,下面一一介绍:

  1. Shortcut Compaction。这个过程是一种快捷Compaction的方式,即无需磁盘IO即可完成Compaction。需要以下前提条件,第一个条件就是此次任务只有一个rowset参与,第二个条件是rowset中segment文件数量至少两个,且文件之间没有数据重叠,第三个条件是rowset没有被Compaction过,第四个条件是执行方式是行式。它的原理是使用文件系统的硬链接能力。

  2. Data Compaction。将挑选出rowsets进行合并,生成一个output rowset。在执行rowsets合并时,会创建一个Reader和一个rowset writer,rowset writer与output rowset相对应。在Reader底层逻辑中,input rowsets中的每一个rowset都会对应一个rowset reader。Reader按照key的排序规则逐行读出input rowsets中的数据,然后通过Rowset Writer写入output rowset。Cumulative Compaction不会将删除的数据行进行真正地删除,这部分工作会在Base Compaction中进行。

  3. Valid Compaction。这部分所做的工作就比较简单了,校验下Compaction输入行数和输出行数、合并行数、过滤行数总和是否相同。

  4. Commit Compaction。这部分工作就是修改下Tablet关于rowset的元数据部分,包括删除旧的版本和添加新版本、close掉输入的rowset和加载rowset。

图3 Compaction任务调度执行流程

五、性能调优思考

Compaction原理机制如上述三个部分介绍。实际生产环境下,需要面对各种各样问题调优。下面以两个场景,做个调优思考,希望抛砖引玉。

第一个场景是Tablet中版本数量有上升趋势或者数值较高,则可以从以下几个方面思考:

第一个方面,是否是Schedule线程中Check Candidate不通过?如果是,可以修改两个参数base_compaction_num_threads_per_disk和cumulative_compaction_num_threads_per_disk,根据任务类型,增加这两个参数,让同时能够执行更多的 Compaction 任务;第二方面,是否是Check线程中Tablet中的rowset不满足被Compaction的条件?可以从Size-Tiered挑选rowset策略入手。

方法主要有两个:

一是降低最小segment数据门槛,可以修改的参数有size_tiered_level_multiple和min_cumulative_compaction_num_singleton_deltas;另一个是缩小执行Base Compaction的间隔。

第二个场景是Compaction占用内存过多,从两个方面考虑:

一是是否是Compaction任务过多导致的内存占用过多?如果是这样,把Compaction任务数调小即可;另一方面是,Compaction的执行方式,尽可能用列式Compaction,通过配置较小的vertical_compaction_max_columns_per_group,让Compaction串行列式方式执行。

上面是两种典型的Compaction调优场景。实际生产环境问题怪象百出、难以定位,因此需要具体问题具体分析。

六、总结

本文以StarRocks新发布的3.2.1版本为基准,介绍了新架构下生产者-消费者模型的Compaction任务管理框架。针对任务管理框架的核心问题,即如何挑选rowset进行Compaction,介绍了基于大小分层的rowset挑选策略,并分析了Compaction紧迫程度评估指标Score的影响因素,总结了该策略的优点;其次阐述了Compaction的调度执行流程;最后,从两个典型场景角度出发,作了Compaction性能调优的思考。

StarRocks通过Compaction机制将不同的数据版本进行聚合,将小文件合并成大文件,非常有效地提升了查询性能。

七、作者介绍

陈海峰,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP内核优化/数据存储/Zero-ETL相关技术的研发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/529083.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-139. 单词拆分【字典树 记忆化搜索 数组 哈希表 字符串 动态规划】

LeetCode-139. 单词拆分【字典树 记忆化搜索 数组 哈希表 字符串 动态规划】 题目描述:解题思路一:Python动态规划五部曲:定推初遍举【先遍历背包 后遍历物品】必须是排列解题思路二:Python动态规划版本二解题思路三:回…

tensorflow.js 使用 opencv.js 将人脸特征点网格绘制与姿态估计线绘制结合起来,以获得更高的帧数

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图 文章目录 系列文章目录前言一、实现步…

实验:基于Red Hat Enterprise Linux系统建立逻辑卷并进行划分

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 1. 为虚拟机添加三块大小为5GB的磁盘nvme0n2 nvme0n3 nvme0n4 2. 将三块硬盘转换为物理卷,并将nvme0n2 nvme0n3两pv建立成名为"自己名字_vg“的卷组,并将nvme0n4扩展进该卷组。 LVM管…

基于单片机四路继电器温湿度控制

**单片机设计介绍, 基于单片机四路继电器温湿度控制 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机四路继电器温湿度控制的设计是一种能够实现精确环境调控的智能化系统。它利用单片机作为核心控制器&…

渗透测试面试题汇总(全)

思路流程 信息收集漏洞挖掘漏洞利用&权限提升清除测试数据&输出报告复测 问题深信服一面:SQL注入防护为什么参数化查询可以防止sql注入SQL头注入点盲注是什么?怎么盲注?宽字节注入产生原理以及根本原因 产生原理在哪里编码根本原因解决办法sql里…

力扣刷题Days33-274. H 指数(js)

目录 1,题目 2,代码 2.1排序 2.2计数排序 3,学习与总结 3.1排序实现的学习总结 3.2计数排序的学习总结 1,题目 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返…

Java 线程池 参数

1、为什么要使用线程池 线程池能有效管控线程,统一分配任务,优化资源使用。 2、线程池的参数 创建线程池,在构造一个新的线程池时,必须满足下面的条件: corePoolSize(线程池基本大小)必须大于…

1.Spring的核心思想 —— IOC和DI

1. Spring是什么? 简单的说,Spring其实指的是Spring Framework(Spring框架),是一个开源框架。 如果要用一句话概括:它是包含众多工具方法的IOC(Inverse of Control控制反转)容器。…

【THM】Net Sec Challenge(网络安全挑战)-初级渗透测试

介绍 使用此挑战来测试您对网络安全模块中获得的技能的掌握程度。此挑战中的所有问题都可以仅使用nmap、telnet和来解决hydra。 挑战问题 您可以使用Nmap、 Telnet 和Hydra回答以下问题。 2.1小于10000的最大开放端口号是多少? 8080 nmap -p- -T4 10.10.234.218 2.2普通…

Java入门-java的方法

java方法 java的方法是用来完成某种功能的代码块。使用方法封装代码块,可以提高代码的可复用性,模块化,使用者无需知道代码的具体实现也能通过方法调用使用其提供的功能,简化了应用过程。 方法结构 一般一个方法的构成有如图几部…

【C++】vector问题解决(非法的间接寻址,迭代器失效 , memcpy拷贝问题)

送给大家一句话: 世界在旋转,我们跌跌撞撞前进,这就够了 —— 阿贝尔 加缪 vector问题解决 1 前言2 迭代器区间拷贝3 迭代器失效问题4 memcpy拷贝问题 1 前言 我们之前实现了手搓vector,但是当时依然有些问题没有解决&#xff…

HarmonyOS 开发-多模态页面转场动效实现案例

介绍 本示例介绍多模态页面转场动效实现:通过半模态转场实现半模态登录界面,通过配置NavDestinationMode类型为DIALOG,实现半模态的背景为透明,再与 全屏模态和组件转场结合实现多模态组合登录场景,其中手机验证码登录…

基于springboot+vue+Mysql的学习平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

【Web】CTFSHOW-2023CISCN国赛初赛刷题记录(全)

目录 Unzip BackendService go_session deserbug 主打一个精简 Unzip 进来先是一个文件上传界面 右键查看源码,actionupload.php 直接访问/upload.php,看到后端的源码 就是上传一个压缩包,对其进行解包处理 因为其是在/tmp下执行…

ip地址切换器安卓版,保护隐私,自由上网

在移动互联网时代,随着智能手机和平板电脑的普及,移动设备的网络连接变得愈发重要。为了满足用户在不同网络环境下的需求,IP地址切换器安卓版应运而生。本文将以虎观代理为例,为您详细解析IP地址切换器安卓版的功能、应用以及其所…

机器学习 基础 笔记 1

train阶段就是正常的学习 validation是知道正确答案是啥,检查正确率 test是不知道正确答案是啥,看看有啥结果 训练的时候记得model.train 测试(后面两种都是)的时候要model.eval (有些模型两种阶段做的事不一样&a…

不要抱怨,不如抱 Java 运算符吧 (下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

2024.4.9-day12-CSS 常用样式属性和字体图标

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 作业 <!DOCTYPE html> <html lang"zh-CN"><he…

P4552 IncDec Sequence(差分)

题目描述 给定一个长度为 n n n 的数列 a 1 , a 2 , ⋯ , a n {a_1,a_2,\cdots,a_n} a1​,a2​,⋯,an​&#xff0c;每次可以选择一个区间 [ l , r ] [l,r] [l,r]&#xff0c;使这个区间内的数都加 1 1 1 或者都减 1 1 1。 请问至少需要多少次操作才能使数列中的所有数都…

rapidssl通配符证书760元

RapidSSL是Geotrust旗下的子品牌&#xff0c;旗下有两款基础型的数字证书产品——基础型单域名SSL证书和基础型通配符SSL证书。RapidSSL旗下的数字证书产品可以为个人或者企事业单位网站提供先进的加密算法和技术&#xff0c;确保网站数据在传输过程中不被窃取或篡改。今天就随…