得物基于StarRocks的OLAP需求实践详解

发布时间:2025-05-16 18:12:58 作者:益华网络 来源:undefined 浏览量(2) 点赞(2)
摘要:1. 什么是 StarRocks 新一代极速全场景MPP数据库,可以用 StarRocks 来支持多种数据分析场景的极速分析; 架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO 优化器,查询速度(尤其是多表关联查询); 很好地支持实时数据分析,并能实现对实时更新数据的

1. 什么是 StarRocks

新一代极速全场景MPP数据库,可以用 StarRocks 来支持多种数据分析场景的极速分析; 架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO 优化器,查询速度(尤其是多表关联查询); 很好地支持实时数据分析,并能实现对实时更新数据的高效查询, 还支持现代化物化视图,以进一步加速查询; 用户可以灵活构建包括大宽表、星型模型、雪花模型在内的各类模型; 兼容 MySQL 协议,支持标准 SQL 语法,易于对接使用,全系统无外部依赖,高可用,易于运维管理。

2. 系统架构

核心进程:FE(Frontend)、BE(Backend)。

注:所有节点都是有状态的。

FE(Frontend)负责管理元数据,管理客户端连接,进行查询规划、查询调度等工作。

 -   Leader:Follower会通过类Paxos的BDBJE协议选主出一个Leader,所有事务的提交都是由Leader发起,并完成;

 -   Follower:提高查询并发,同时参与投票,参与选主操作。

Follower

Observer:不参与选主操作,只会异步同步并且回放日志,主要用于扩展集群的查询并发能力。

BE(Backend)负责数据存储以及SQL执行等工作。

3. 存储架构

在StarRocks里,一张表的数据会被拆分成多个Tablet,而每个Tablet都会以多副本的形式存储在BE节点中,如下图:

Table数据划分 + Tablet三副本的数据分布:

StarRocks支持Hash分布、Range-Hash的组合数据分布(推荐)。

为了等到更高的性能,强烈建议使用Range-Hash的组合数据分布,即先分区后分桶的方式。

Range分区可动态添加和删减; Hash分桶一旦确定,不能再进行调整,只有未创建的分区才能设置新的分桶数。

分区和分桶的选择是非常关键的。在建表时选择好的分区分桶列,可以有效提高集群整体性能。

以下是针对特殊应用场景下,对分区和分桶选择的一些建议:

数据倾斜:业务方如果确定数据有很大程度的倾斜,那么建议采用多列组合的方式进行数据分桶,而不是只单独采用倾斜度大的列做分桶。 高并发:分区和分桶应该尽量覆盖查询语句所带的条件,这样可以有效减少扫描数据,提高并发。 高吞吐:尽量把数据打散,让集群以更高的并发扫描数据,完成相应计算。

3.1 表的存储

对表进行存储时,会对表进行分区和分桶两层处理,将表的数据分散到多台机器进行存储和管理。

分区机制:高效过滤,提升查询性能。

分区类似分表,是对一个表按照分区键进行分割,可以按照时间分区,根据数据量按照天/月/年划分等等。可以利用分区裁剪对少数访问量,也可以根据数据的冷热程度把数据分到不同介质上。

分桶机制:充分发挥集群性能,避免热点问题。

使用分桶键Hash以后,把数据均匀的分布到所有的BE上,不要出现bucket数据倾斜的情况,分桶键的选择原则就是高基数的列或者多个列组合成为一个高基数的列,尽量将数据充分打散。 注:Bucket数量的需要适中,如果希望充分发挥性能可以设置为:BE数量 * CPU core/2,最好tablet控制在1GB左右,tablet太少并行度可能不够,太多可能远数据过多,底层scan并发太多性能下降。

Tablet:最小的数据逻辑单元,可以灵活设置并行计算资源。

一张表被切分成了多个Tablet,StarRocks在执行SQL语句时,可以对所有Tablet实现并发处理,从而充分的利用多机、多核提供的计算能力。 表在创建的时候可以指定副本数,多副本够保证数据存储的高可靠,以及服务的高可用。

Rowset:每一次的数据变更就会产生一个Rowset。

就是以组列存方式组织的的一些文件,每次的commit都会产生一个新的版本,每个版本包含哪些Rowset。 每次写入都会增加一个版本(无论是单条、还是stream load几个G的文件)。

Segment:如果一个Rowset数据量比较大,则拆分成多个Segment数据断落盘。

4. 需求背景

案例一:

业务背景

指标工厂服务主要面向业务人员,通过对业务指标的采集和处理,实时反映产品状态,为运营提供数据支撑、检测产品漏洞或服务异常、提供指标异常告警功能等。

业务场景分析

业务指标埋点方式多样,并不局限于某种方式,只要符合埋点标识明确、业务参数丰富、数据满足可解析的基本要求皆可作为数据源,大致可以分为:SDK、MySQL BinLog、业务日志、阿里云ODPS数据分析。

存在的挑战,各种业务场景众口难调,归纳数据特征如下:

需要全量日志明细; 需要数据可以始终是最新的,即满足实时更新场景; 需要对数据做层级聚合的,即可能是月、周、日、小时等; 需要可以承载更大的写入量; 每个业务数据都要灵活的配置数据的保存时间; 数据源来源多,报表定制化比较高,有多个数据源合并成一个大宽表的场景、也有多表连接的的需求; 各种监控图、报表展示、业务实时查询等,即较高的并非查询。

引入StarRocks

幸运的是StarRocks有比较丰富的数据模型,覆盖了上面的所有业务场景的需求,即:明细模型、更新模型、聚合模型、主键模型,同时选择更为灵活的星型模型代替大宽表的方式,即直接使用多表关联来查询。

明细模型: 埋点数据经过结构化处理后按明细全量存储; 该场景对DB在亿级数据量下查询性能有较高的要求; 数据可以通过配置动态分区来配置过期策略; 场景使用时从结构化数据选择个别字段维度在线聚合查询。 聚合模型: 埋点数据数据量巨大,且对明细数据不要求溯源,直接做聚合计算,比如计算PV、UV场景; 数据可以通过配置动态分区来配置过期策略。 更新模型: 埋点数据状态会发生变动,且需要实时更新数据,更新数据范围不会跨度多个分区的,比如:订单、优惠券状态等; 数据可以通过配置动态分区来配置过期策略。

基于以上业务场景的分析,这三种模型可以完美解决数据的问题。

需要实时的数据写入场景,我也沿用了业内流行的解决方案,即数据采集到 Kafka 之后,使用Flink做实时写入到StarRocks。StarRocks提供了非常好用的Flink-connector插件。

小tips:

1. 虽然StarRocks已经很好的优化了写入性能,当写入压力大,仍会出现写入拒绝,建议可适当增大单次导入数据量,降低频率,但同时也会导致数据落库延迟增加。所以需要做好一定的取舍,做到收益最大化。 

2. Flink的sink端不建议配置过大,会引起并发事务过多的报错,建议每个flink任务source可以配置多些,sink的连接数不能过大。

小结

集群规模:5FE(8c32GB)、5BE(32c128GB)

目前该方案已支持数百个业务指标的接入,涉及几十个大盘的指标展示和告警,数据存储TB级,每日净增长上百G,总体运行稳定。

案例二:

业务背景

内部系统业务看板,主要服务于全公司员工,提供项目及任务跟踪等功能。

业务场景分析

分析业务特点:

数据变更频繁(更新),变更时间跨度长 查询时间跨度多 报表需准实时更新 关联维表查询多,部门/业务线/资源域等 冷热数据,最近数据查询频繁 历史架构与痛点

当初数据库选型时,结合业务特点,用户需要动态、灵活的增删记录自己的任务,因而选择了JOSN 模型减少了应用程序代码和存储层之间的阻抗,选择MongoDB作为数据存储。

伴随着公司快速快发,当需要报表展示,特别是时间跨度比较大,涉及到多部门、多维度、细粒度等报表展示时,查询时间在MongoDB需要执行10s甚至更久。

引入StarRocks

调研了StarRocks、ClickHouse两款都是非常优秀的分析型数据库,在选型时,分析了业务应用场景,主要集中在单表聚合查询、多表关联查询、实时更新读写查询。维度表更新频繁,即存储在MySQL中,StarRocks比较好的支持外表关联查询,很大程度上降低了开发难度,最终决定选用StarRocks作为存储引擎。

改造阶段,将原先MongoDB中的一个集合拆分成3张表。使用明细模型,记录每天的对应人员的任务信息,按天分区,由之前的每人每天一条记录改为,以事件为单位,每人每天可以多条记录。

实现频繁更新的维表,则选择使用外部表,减少维度数据同步到StarRocks的复杂度。

小结

改造前,MongoDB查询,写法复杂,多次查询。

?

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!