文章目录
- 1. 什么是StarRocks?
- 1.1. 适用场景
- 1.2. [产品特性](https://docs.starrocks.io/zh-cn/latest/introduction/Features)
- 2. 系统架构
- 2.1. 系统架构
- 2.1.1. 整体架构
- 2.1.2. 高可用实现方式
- 2.2. 数据如何管理?
- 3. 表模型
- 3.1. 明细模型
- 3.2. 聚合模型
- 3.3. 更新模型
- 3.4. [主键模型](https://docs.starrocks.io/zh-cn/latest/table_design/table_types/primary_key_table)
- 4. 数据导入导出
- 4.1. 数据导入
- 4.2. 导出数据
- 5. 使用 Catalog 管理和查询内外部数据
- 5.1. Catalog
- 5.2. 外部表
- 5.3. 文件外部表
- 6. 物化视图
- 6.1. 同步物化视图
- 6.2. 异步物化视图
- 6.3. Colocate Join(大表关联)
- 7. 架构升级示例
- 案例1 [海尔云链 金融数据查询增速三倍,服务器成本减半](https://blog.csdn.net/flyinthesky111/article/details/124407888)
- 案例2 广告行业中的实时分析场景
其它文章请参考
数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计
数据仓库系列:StarRocks的简单试用及与clickhouse的对比
数据仓库系列:如何将StarRocks集群与Jupyter集成?
1. 什么是StarRocks?
StarRocks 是一款MPP DB, 对标ClickHouse、Vertica、Teradata、Greenplum,在查询性能上远超当代最快的开源数据库 clickhouse,目前已经被一众互联网企业在生产环境中采用。
新一代极速全场景 MPP (Massively Parallel Processing) 数据库
是fork doris后独立运营的商业化版本StarRocks
1.1. 适用场景
StarRocks 可以满足企业级用户的多种分析需求,主要使用场景如下:
OLAP (Online Analytical Processing) 多维分析
如自助式报表平台,用户行为分析实时数据仓库
如电商大促数据分析、广告投放分析高并发查询
如如广告主报表分析统一分析
- 通过使用一套系统解决多维分析、高并发查询、预计算、实时分析查询等场景,降低系统复杂度和多技术栈开发与维护成本。
- 使用 StarRocks 统一管理数据湖和数据仓库,将高并发和实时性要求很高的业务放在 StarRocks 中分析,也可以使用 External Catalog 和外部表进行数据湖上的分析。
详见适用场景
1.2. 产品特性
- MPP 分布式执行框架
在 MPP 框架中,数据会被 Shuffle 到多个节点,并且由多个节点来完成最后的汇总计算。在复杂计算时(比如高基数 Group By,大表 Join 等操作),StarRocks 的 MPP 框架相对于 Scatter-Gather 模式的产品有明显的性能优势
- 全面向量化 MPP 查询引擎: 充分发挥了 CPU 的处理能力,同时支持极速的单表和多表查询性能
- CBO 优化器: 支持极速的秒级 AdHoc 查询
- 可实时更新的列式存储引擎: 具备极致的实时更新和查询性能
- 全新设计的数据分布模式,具备高并发查询能力, 可以支持每秒上万次的并发查询能力。
- 智能的物化视图: 使用物化视图(materialized view)进行查询加速和数仓分层, 具备灵活透明的预计算加速能力
- 数据湖分析: StarRocks 主要负责数据的计算分析,而数据湖则主要负责数据的存储、组织和维护
2. 系统架构
2.1. 系统架构
2.1.1. 整体架构
StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE(Backend)两类进程,不依赖任何外部组件,方便部署与维护
StarRocks 的整体架构如下图:
- FE(Frontend)前端节点: 多个FE组成第一层,提供FE的
横向扩展和高可用
。- 负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。
- 每个 FE 节点都会在内存保留一份完整的元数据,这样每个 FE 节点都能够提供无差别的服务
- BE(Backend)后端节点: 多个BE组成第二层
- 负责数据存储与管理、查询计划执行等工作
- FE 和 BE 模块都可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点
- StarRocks 提供 MySQL 协议接口,支持标准 SQL 语法
2.1.2. 高可用实现方式
FE 有三种角色:Leader FE,Follower FE 和 Observer FE。Follower 会通过类 Paxos 的 Berkeley DB Java Edition(BDBJE)协议自动选举出一个 Leader
- Leader
- Leader 从 Follower 中自动选出,进行选主需要集群中有半数以上的 Follower 节点存活。如果 Leader 节点失败,Follower 会发起新一轮选举。
- Leader FE 提供元数据读写服务。只有 Leader 节点会对元数据进行写操作,Follower 和 Observer 只有读取权限。Follower 和 Observer 将元数据写入请求路由到 Leader 节点,Leader 更新完数据后,会通过 BDB JE 同步给 Follower 和 Observer。必须有半数以上的 Follower 节点同步成功才算作元数据写入成功。
- Follower
- 只有元数据读取权限,无写入权限。通过回放 Leader 的元数据日志来异步同步数据。
- 参与 Leader 选举,必须有半数以上的 Follower 节点存活才能进行选主。
- Observer
- 主要用于扩展集群的查询并发能力,可选部署。
- 不参与选主,不会增加集群的选主压力。
- 通过回放 Leader 的元数据日志来异步同步数据。
2.2. 数据如何管理?
StarRocks 使用列式存储,采用分区分桶机制进行数据管理。
表按照日期划分为 4 个分区,第一个分区进一步切分成 4 个 Tablet。每个 Tablet 使用 3 副本进行备份,分布在 3 个不同的 BE 节点上。
- 一张表被切分成了多个 Tablet,StarRocks 在执行 SQL 语句时,可以对所有 Tablet 实现并发处理,从而充分的利用多机、多核提供的计算能力
- Tablet 的分布方式与具体的物理节点没有相关性。在 BE 节点规模发生变化时,比如在扩容、缩容时,StarRocks 可以做到无需停止服务,直接完成节点的增减。节点的变化会触发 Tablet 的自动迁移
- 支持 Tablet 多副本存储,默认副本数为三个。多副本能够保证数据存储的高可靠以及服务的高可用。
相关的SQL语句
-- 建表SQL
CREATE TABLE IF NOT EXISTS sr_member (
sr_id INT,
name STRING,
city_code INT,
reg_date DATE,
verified BOOLEAN
)
PARTITION BY RANGE(reg_date)
(
START ("2021-01-01") END ("2021-12-31") EVERY (INTERVAL 3 MONTH)
)
DISTRIBUTED BY HASH(city_code) BUCKETS 4
PROPERTIES(
"replication_num" = "1"
);
-- 查看表分区
show partition from test.sr_member;
-- 查看tablet
show tablet from test.sr_member;
3. 表模型
3.1. 明细模型
适用场景
- 分析原始数据,例如原始日志、原始操作记录等。
- 查询方式灵活,不需要局限于预聚合的分析方式。
- 导入日志数据或者时序数据,主要特点是旧数据不会更新,只会追加新的数据。
建表示例
CREATE TABLE IF NOT EXISTS detail (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
device_code INT COMMENT "device code",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES("replication_num" = "1");
注意事项:
- 排序键的相关说明:
- 在建表语句中,排序键必须定义在其他列之前。
- 排序键可以通过
DUPLICATE KEY
显式定义。本示例中排序键为event_time
和event_type
。
如果未指定,则默认选择表的前三列作为排序键。 - 明细模型中的排序键可以为部分或全部维度列。
- 建表时,支持为指标列创建 BITMAP、Bloom Filter 等索引。
- 建表时必须使用 DISTRIBUTED BY HASH 子句指定分桶键, 也可以不指定(自 2.5.7 版本起,会自动设置分桶数量 (BUCKETS))
3.2. 聚合模型
适用场景:数据统计和分析场景
- 大多数查询是聚合查询,例如SUM、COUNT和MAX。
- 不需要检索原始的详细数据。
- 历史数据不经常更新。只追加新数据。
建表示例
CREATE TABLE IF NOT EXISTS example_db.aggregate_tbl (
site_id LARGEINT NOT NULL COMMENT "id of site",
date DATE NOT NULL COMMENT "time of event",
city_code VARCHAR(20) COMMENT "city_code of user",
pv BIGINT SUM DEFAULT "0" COMMENT "total page views"
)
AGGREGATE KEY(site_id, date, city_code)
DISTRIBUTED BY HASH(site_id) BUCKETS 8
PROPERTIES ("replication_num" = "1");
注意事项:
- 排序键的相关说明
- 在建表语句中,排序键必须定义在其他列之前。
- 如果 AGGREGATE KEY 未包含全部维度列(除指标列之外的列),则建表会失败。
- 如果不通过 AGGREGATE KEY 显示定义排序键,则默认除指标列之外的列均为排序键。
- 排序键必须满足唯一性约束,必须包含全部维度列,并且列的值不会更新。
- 在运行查询时,排序键在多版聚合之前就能进行过滤,而指标列的过滤在多版本聚合之后
- 建表时,不支持为指标列创建 BITMAP、Bloom Filter 等索引
- 将数据加载到使用聚合键模型的表中时,只能更新表的所有列
3.3. 更新模型
适用场景
- 需要实时和频繁更新数据的业务场景,如在电子商务场景中,每天可以下数亿个订单,订单状态经常变化
建表示例
CREATE TABLE IF NOT EXISTS orders (
create_time DATE NOT NULL COMMENT "create time of an order",
order_id BIGINT NOT NULL COMMENT "id of an order",
order_state INT COMMENT "state of an order",
total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 8
PROPERTIES ("replication_num" = "1");
注意事项:
- 主键的相关说明:
- 在建表语句中,主键必须定义在其他列之前。
- 主键通过
UNIQUE KEY
定义。 - 主键必须满足唯一性约束,且列的值不会修改。
- 设置合理的主键。
- 查询时,主键在聚合之前就能进行过滤,而指标列的过滤通常在多版本聚合之后,因此建议将频繁使用的过滤字段作为主键,在聚合前就能过滤数据,从而提升查询性能。
- 聚合过程中会比较所有主键,因此需要避免设置过多的主键,以免降低查询性能。如果某个列只是偶尔会作为查询中的过滤条件,则不建议放在主键中。
- 建表时,不支持为指标列创建 BITMAP、Bloom Filter 等索引。
3.4. 主键模型
适用场景: 适用于实时和频繁更新的场景
- 实时对接事务型数据至 StarRocks
- 利用部分列更新轻松实现多流 JOIN
建表示例
create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
) PRIMARY KEY (dt, order_id)
PARTITION BY RANGE(`dt`) (
PARTITION p20210820 VALUES [('2021-08-20'), ('2021-08-21')),
PARTITION p20210821 VALUES [('2021-08-21'), ('2021-08-22')),
PARTITION p20210929 VALUES [('2021-09-29'), ('2021-09-30')),
PARTITION p20210930 VALUES [('2021-09-30'), ('2021-10-01'))
) DISTRIBUTED BY HASH(order_id) BUCKETS 4
PROPERTIES("replication_num" = "1","enable_persistent_index" = "true");
create table users (
user_id bigint NOT NULL,
name string NOT NULL,
email string NULL,
address string NULL,
age tinyint NULL,
sex tinyint NULL,
last_active datetime,
property0 tinyint NOT NULL
) PRIMARY KEY (user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 4
PROPERTIES("replication_num" = "1","enable_persistent_index" = "true");
注意事项:
- 主键相关的说明:
- 在建表语句中,主键必须定义在其他列之前。
- 主键通过
PRIMARY KEY
定义。 - 主键必须满足唯一性约束,且列的值不会修改。本示例中主键为
dt
、order_id
。 - 主键支持以下数据类型:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、DATETIME、VARCHAR/STRING。并且不允许为 NULL。
- 分区列和分桶列必须在主键中。
- 合理设置主键的列数和长度。建议主键为占用内存空间较少的数据类型,例如 INT、BIGINT 等,暂时不建议为 VARCHAR。
- the memory occupied by the primary key index 的计算公式: (主键长度+9) x 记录数量 x 副本数 x 1.5 = 占用内存大小
- 9是每行不可变的开销,
- 1.5是每个哈希表的平均额外开销
- enable_persistent_index:主键索引可以持久化到磁盘并存储在内存中,以避免占用太多内存。
4. 数据导入导出
4.1. 数据导入
- 所有导入方式都提供原子性保证,即同一个导入作业内的所有有效数据要么全部生效,要么全部不生效,不会出现仅导入部分数据的情况。
- 通过导入作业实现数据导入。每个导入作业都有一个标签 (Label),由用户指定或系统自动生成,用于标识该导入作业
- 提供两种访问协议用于提交导入作业:MySQL 协议和 HTTP 协议
详见用法参见: 导入总览
4.2. 导出数据
导出使用详见EXPORT,
注意:
- 导出路径需要各个BE节点都可以访问,不能是本地路径
- 目前支持HDFS及对象存储,如
- Alibaba Cloud OSS
- Tencent Cloud COS
- AWS S3
- Huawei Cloud OBS
导出示例SQL
EXPORT TABLE db1.tbl1
PARTITION (p1,p2)
(col1, col3)
TO "hdfs://HDFS_IP:HDFS_Port/export/lineorder_"
PROPERTIES
(
"column_separator"=",",
"load_mem_limit"="2147483648",
"timeout" = "3600"
)
WITH BROKER
(
"username" = "user",
"password" = "passwd"
);
5. 使用 Catalog 管理和查询内外部数据
5.1. Catalog
外部数据:指保存在外部数据源(如 Apache Hive™、Apache Iceberg、Apache Hudi、Delta Lake、JDBC)中的数据。
通过Catalog不需要执行数据导入就可以直接查询
External catalog: 外部数据目录,用于连接外部 metastore。在 StarRocks 中,您可以通过 external catalog 直接查询外部数据,无需进行数据导入或迁移。当前支持创建以下类型的 external catalog:
- Hive catalog:用于查询 Hive 数据。
- 数据湖
- Iceberg catalog:用于查询 Iceberg 数据。
- Hudi catalog:用于查询 Hudi 数据。
- Delta Lake catalog:用于查询 Delta Lake 数据。
- JDBC catalog:用于查询 JDBC 数据源的数据。
CREATE EXTERNAL CATALOG jdbc0
PROPERTIES
(
"type"="jdbc",
"user"="postgres",
"password"="changeme",
"jdbc_uri"="jdbc:postgresql://127.0.0.1:5432/jdbc_test",
"driver_url"="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar",
"driver_class"="org.postgresql.Driver"
);
CREATE EXTERNAL CATALOG jdbc1
PROPERTIES
(
"type"="jdbc",
"user"="root",
"password"="changeme",
"jdbc_uri"="jdbc:mysql://127.0.0.1:3306",
"driver_url"="https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar",
"driver_class"="com.mysql.cj.jdbc.Driver"
);
5.2. 外部表
StarRocks 支持以外部表 (External Table)
的形式,接入其他数据源。外部表指的是保存在其他数据源中的数据表,而 StartRocks 只保存表对应的元数据,并直接向外部表所在数据源发起查询。
目前 StarRocks 已支持的第三方数据源包括
- MySQL、
- StarRocks、
- Elasticsearch、
- Apache Hive™、
- Apache Iceberg
- Apache Hudi。
对于 StarRocks 数据源,现阶段只支持 Insert 写入,不支持读取,对于其他数据源,现阶段只支持读取,还不支持写入。
CREATE EXTERNAL TABLE mysql_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=mysql
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "3306",
"user" = "mysql_user",
"password" = "mysql_passwd",
"database" = "mysql_db_test",
"table" = "mysql_table_test"
);
5.3. 文件外部表
文件外部表 (File External Table) 是一种特殊的外部表。您可以通过文件外部表直接查询外部存储系统上的 Parquet 和 ORC 格式的数据文件,无需导入数据。同时,文件外部表也不依赖任何 Metastore。StarRocks 当前支持的外部存储系统包括 HDFS、Amazon S3 及其他兼容 S3 协议的对象存储、阿里云对象存储 OSS 和腾讯云对象存储 COS。
USE db_example;
CREATE EXTERNAL TABLE table_1
(
name string,
id int
)
ENGINE=file
PROPERTIES
(
"path" = "s3://bucket-test/folder1/",
"format" = "orc",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::51234343412:role/role_name_in_aws_iam",
"aws.s3.region" = "us-west-2"
);
6. 物化视图
6.1. 同步物化视图
同步物化视图下,所有对于基表的数据变更都会自动同步更新到物化视图中。您无需手动调用刷新命令,即可实现自动同步刷新物化视图。同步物化视图的管理成本和更新成本都比较低,适合实时场景下单表聚合查询的透明加速。
6.2. 异步物化视图
相较于同步物化视图,异步物化视图支持多表关联以及更加丰富的聚合算子。异步物化视图可以通过手动调用或定时任务的方式刷新,并且支持刷新部分分区,可以大幅降低刷新成本。除此之外,异步物化视图支持多种查询改写场景,实现自动、透明查询加速。
** 单表聚合** | 多表关联 | 查询改写 | 刷新策略 | 基表 | |
---|---|---|---|---|---|
StarRocks 2.5 异步物化视图 | 是 | 是 | 是 | 异步定时刷新手动刷新 | 支持多表构建。基表可以来自:Default CatalogExternal Catalog已有异步物化视图 |
StarRocks 2.4 异步物化视图 | 是 | 是 | 否 | 异步定时刷新手动刷新 | 支持基于 Default Catalog 的多表构建 |
同步物化视图(Rollup) | 仅部分聚合算子 | 否 | 是 | 导入同步刷新 | 仅支持基于 Default Catalog 的单表构建 |
6.3. Colocate Join(大表关联)
Colocate Join 功能是分布式系统实现 Join 数据分布的策略之一,能够减少数据多节点分布时 Join 操作引起的数据移动和网络传输,从而提高查询性能。
- 使用 Colocate Join 功能,您需要在建表时为其指定一个 Colocation Group(CG),同一 CG 内的表需遵循相同的 Colocation Group Schema(CGS),即表对应的分桶副本具有一致的分桶键、副本数量和副本放置方式
- 如此可以保证同一 CG 内,所有表的数据分布在相同一组 BE 节点上。当 Join 列为分桶键时,计算节点只需做本地 Join,从而减少数据在节点间的传输耗时,提高查询性能
7. 架构升级示例
案例1 海尔云链 金融数据查询增速三倍,服务器成本减半
- 在实时处理方面用 StarRocks 替代了以前的 Hbase+Phoenix,
- 离线数据方面也部分用 StarRocks 替代了 Hive+Alluxio+Presto。
迭代新架构后
- 查询效率大幅提升,查询平均耗时得到了大幅缩减
- 服务器成本整体减低到接近原体系架构的一半
- 以前使用多服务多组件,如今统一到 StarRocks,使得运维成本也得到了大大降低。
案例2 广告行业中的实时分析场景
- StarRocks 在写入和查询性能上都有比较好的表现;
- StarRocks 的主键能力能够承担部分 ElasticSearch 的点查点更新的场景;
- StarRocks 有 Connector 能力,能够直接将 ElasticSearch 作为外表关联进行一些数据探索的能力,同时也支持了谓词下推等能力,使 - - - StarRocks 与 ElasticSearch 的数据之间产生了很好的联系;
- 因为在非常高的 QPS 的情况下,StarRocks 的能力还未能满足 QPS 和 latency 的要求,所以目前只是部分的更新和点查场景交给了 StarRocks,依然保留了 ElasticSearch 与 StarRocks 共存的场景;
- StarRocks 的扩缩容能力较好,面对不断变化的业务负载有很好的管理。