StarRocks采用Range-Hash的组合数据分布方式,也就是我们一直在提的分区分桶方式。
1分区
StarRocks中的分区是在建表时通过PARTITION BY RANGE()语句设置,用于分区的列也被称之为分区键,当前分区键仅支持日期类型和整数类型(支持一列或多列)。例如前文中表table01中“PARTITION BY RANGE(event_time)”,event_time即为分区键。若建表时我们不进行分区,StarRocks会将整个table作为一个分区(这个分区的名称和表名相同)。
StarRocks会将数据使用分区进行裁剪,例如按天分区时,每天的数据都会单独存储在一个分区内,当我们使用where查找某天的数据时,就会只去搜索对应分区的数据,减少数据扫描量。
分区的另一个目的是可以将分区作为单独的管理单元,我们可以直接为某个分区设置存储策略,比如副本数、冷热策略和存储介质等。
StarRocks支持在一个集群内使用多种存储介质(HDD/SSD)。我们就可以为分区设置不同的存储介质,比如将最新数据所在的分区放在SSD上,利用SSD的随机读写性能来提高查询性能。而老的数据可以放在HDD中,以节省数据存储的成本。
2分桶
对每个分区的数据,StarRocks还会再进行Hash分桶。我们在建表时通过DISTRIBUTED BY HASH()语句来设置分桶,用于分桶的列也被称之为分桶键。分桶键可以是一列或多列,例如前文中表table06的user_id就是分桶键。在聚合模型和更新模型\主键模型下,分桶键必需是排序键中的列。
分桶键Hash值对分桶数取模得到桶的序号(Bucket Seq),假设一个Table的分桶数为8,则共有[0, 1, 2, 3, 4, 5, 6, 7]共8个分桶(Bucket)。同一分区内,分桶键哈希值相同的数据形成(Tablet)子表。
分桶的目的就是将数据打散为一个个逻辑分片(Tablet),以Tablet作为数据均衡的最小单位,使数据尽量均匀的分布在集群的各个BE节点上,以便在查询时充分发挥集群多机多核的优势。
在StarRocks中,Partition是数据导入和备份恢复的最小逻辑单位,Tablet是数据复制和均衡的最小物理单位。表(Table)、分区(Partition)、逻辑分片(Tablet)的关系如下图:
3副本数
StarRocks中的副本数就是同一个Tablet保存的份数,在建表时通过replication_num参数指定,也可以后面修改。默认不指定时,StarRocks使用三副本建表,也即每个Tablet会在不同节点存储三份(StarRocks的副本策略会将某个tablet的副本存储在与其不同IP的节点)。
为方便理解,我们假设当前有一个3BE节点的集群,有表Table A和Table B,表A和表B建表时都未设置分区(视为一个大分区),分桶数为3,副本数replication_num为2,则表A和表B在集群中数据分布的一种可能如下图:
总结一下:分区是针对表的,是对表的数据取段。分桶是针对每个分区的,会将分区后的每段数据打散为逻辑分片Tablet。副本数是针对Tablet的,是指Tablet保存的份数。那么我们不难发现,对某一个数据表,若每个分区的分桶数一致,其总Tablet数:
总Tablet数=分区数*分桶数*副本数
以table01为例,我们为其设置了3个分区,为每个分区设置了20个分桶,又对分桶后的tablet设置了1副本,则table01的总tablet数=3*20*1=60个。查看table01的tablet信息,发现确实共有60个tablet:
mysql> show tablet from table01;
…………
60 rows in set (0.01 sec)
4设置规范
理清了分区分桶和副本数的概念,我们再来研究一下该如何规范的进行分区分桶。
4.1分区规范
分区键选择:当前分区键仅支持日期类型和整数类型,为了让分区能够更有效的裁剪数据,我们一般也是选取时间列作为分区键。
分区粒度选择:StarRocks的分区粒度视数据量而定,单个分区原始数据量建议维持在100G以内。
4.2分桶规范
分桶键选择:分桶的目的我们一直在说是为了将数据打散,所以分桶键就需要选择高基数的列(去重后数据量最大的列)。分桶后的数据如果出现严重的数据倾斜,就可能导致系统局部的性能瓶颈,所以我们也可以视情况使用两个或三个列作为分桶键,尽量的将数据均匀分布。我们可以show语句查看表中的数据分布情况:
mysql> show tablet from tablename;
分桶数:分桶数的设置需要适中,如果分桶过少,查询时查询并行度上不来(CPU多核优势体现不出来)。而如果分桶过多,会导致元数据压力比较大,数据导入导出时也会受到一些影响。
分桶数的设置通常也建议以数据量为参考,从经验来看,每个分桶的原始数据建议不要超过5个G,考虑到压缩比,也即每个分桶的大小建议在100M-1G之间。
若不好估算数据量,我们也可以将分桶数设为:分桶数=“BE个数*BE节点CPU核数”或者“BE个数*BE节点CPU核数/2”,这样一般也不会有什么问题。这里需要注意的是,已创建分区的分桶数不能修改(有其他方式能实现,但比较麻烦),所以前期设定合适的分桶数非常重要。
5动态分区
在StarRocks中,必须先有分区,才能将对应的数据导入进来,不然导入就会报错(提示there is a row couldn’t find a partition)。比如使用日期作为分区,那就需要先创建每天的分区,再进行数据导入。在日常业务中,除了每日会新增数据,我们还会对旧的历史数据进行清理。动态分区就是StarRocks用来实现新分区自动创建以及过期分区自动删除的方式。
动态分区由后台常驻进程调度,默认调度周期为10分钟一次,由FE配置文件中的dynamic_partition_check_interval_seconds参数控制(单位是秒,配置文件中默认没有该配置),所以并不是创建动态分区表后所有分区就立刻被创建,我们还需要等待不超过10分钟让后台调度生效。
咱们创建一个动态分区表table07:
CREATE TABLE starrocks.table07(

本文详细介绍了StarRocks的分区、分桶和副本数的概念及其作用。分区通过RANGE()设置,用于数据裁剪和管理;分桶使用HASH()进行数据打散,确保数据均匀分布;副本数用于数据冗余和容错。动态分区允许自动创建和删除,适应数据生命周期管理。此外,文章还讨论了如何合理设置分区和分桶,以及如何修改和管理这些参数。最后,提到了冷热分区策略,以优化存储成本和查询性能。
最低0.47元/天 解锁文章
5197

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



