starrocks(原名 dorisdb,后开源并更名为 starrocks)是一款高性能、实时、mpp(大规模并行处理)架构的现代化分布式 sql 数据库,专为 olap(在线分析处理) 场景设计。它兼容 mysql 协议,支持标准 sql,具备亚秒级查询响应能力,适用于实时报表、即席查询、多维分析、用户画像、日志分析等场景。
一、核心基础概念
1.表模型(table model)
starrocks 提供三种数据模型,适应不同业务场景:
| 模型 | 适用场景 | 特点 |
|---|---|---|
| aggregate key(聚合模型) | 预聚合指标(如 sum、count) | 相同 key 的 value 自动聚合(如 sum(clicks)) |
| unique key(唯一主键模型) | 实时更新、主键去重 | 支持 upsert,类似 hudi/iceberg 的主键更新 |
| duplicate key(明细模型) | 日志、事件流等原始明细 | 不聚合,保留所有记录,支持排序键加速查询 |
✅ 推荐:
- 实时数仓 → unique key(支持 cdc 更新)
- 报表聚合 → aggregate key
- 原始日志 → duplicate key
2.分区(partition)与分桶(bucket)
- 分区(partition):按时间/地域等逻辑切分数据(如
partition by range(date)),用于分区裁剪。 - 分桶(bucket):每个分区内按 hash(分桶列) 分成多个 tablet(物理存储单元),实现并行计算。
-- 示例:按天分区,按 user_id 分桶
create table user_behavior (
event_time datetime,
user_id bigint,
item_id bigint,
behavior varchar(32)
)
engine=olap
duplicate key(event_time, user_id)
partition by range(event_time) (
partition p20241201 values less than ("2024-12-02"),
partition p20241202 values less than ("2024-12-03")
)
distributed by hash(user_id) buckets 10;3.物化视图(materialized view)
- 自动构建预聚合索引,加速特定查询模式;
- 查询时自动路由到最优物化视图(无需改写 sql);
- 支持 rollup(上卷)、bitmap 精确去重、hll 近似去重。
-- 创建物化视图:按天统计 uv
create materialized view uv_daily_mv
as
select
date(event_time) as dt,
bitmap_union(to_bitmap(user_id)) as uv
from user_behavior
group by date(event_time);4.向量化引擎 + cbo 优化器
- 向量化执行:一次处理 1024 行,大幅提升 cpu 利用率;
- 基于成本的优化器(cbo):自动选择最优 join 顺序、索引、聚合策略;
- 支持 runtime filter、predicate pushdown 等高级优化。
二、系统架构(shared-nothing mpp)
starrocks 采用 无共享(shared-nothing) 架构,主要包含两类节点:
1.fe(frontend)—— 元数据 & 查询协调
- 角色:
- leader fe:管理元数据(表结构、分区信息)、选举主节点;
- follower fe:参与元数据写入(多数派共识);
- observer fe:只读副本,提升高并发查询能力。
- 功能:
- sql 解析、查询计划生成;
- 集群管理、负载均衡;
- 兼容 mysql 协议(客户端直连 fe)。
2.be(backend)—— 存储 & 计算
- 负责数据存储(tablet)、本地计算、向量化执行;
- 数据在 be 上以 列式存储(column-oriented),支持 parquet-like 编码;
- 自动副本管理(默认 3 副本),支持跨机架容灾。
+---------------------+
| client (mysql) |
+----------+----------+
|
+-----v-----+
| fe (sql解析, 优化) |
+-----+-----+
|
+-------v--------+ +------------------+
| be1 (tablet a) | <---> | be2 (tablet b) |
+----------------+ +------------------+
| |
+-------v--------+ +------v-----------+
| be3 (副本) | | be4 (副本) |
+----------------+ +------------------+
✅ 优势:
- 无单点瓶颈,横向扩展;
- 计算靠近数据(data locality);
- 自动故障恢复。
三、核心使用语法(兼容 mysql)
1.建表(关键参数)
create table sales (
sale_date date,
region varchar(32),
product_id int,
amount decimal(10,2),
user_id bigint
)
engine=olap
aggregate key(sale_date, region, product_id)
partition by range(sale_date) (
start ("2024-01-01") end ("2025-01-01") every (interval 1 day)
)
distributed by hash(product_id) buckets 16
properties(
"replication_num" = "3",
"storage_format" = "default"
);2.数据导入
方式 1:stream load(http 推送)
curl --location-trusted -u user:passwd \
-h "label:load_20241229" \
-h "column_separator:," \
-t data.csv http://fe_host:8030/api/db/sales/_stream_load
方式 2:routine load(kafka 实时消费)
create routine load db.sales_kafka on sales
properties(
"desired_concurrent_number"="3",
"max_batch_interval" = "20"
)
from kafka(
"kafka_broker_list" = "kafka:9092",
"kafka_topic" = "sales_topic",
"property.kafka_default_offsets" = "offset_beginning"
);
方式 3:broker load(从 hdfs/s3 批量导入)
load label db.load_hdfs_001
(data infile("hdfs://path/to/data.parquet")
into table sales
format as "parquet")
with broker "my_broker";
3.查询示例
-- 多表 join(支持 shuffle/broadcast)
select
u.city,
sum(s.amount) as total
from sales s
join user_dim u on s.user_id = u.id
where s.sale_date >= '2024-12-01'
group by u.city
order by total desc
limit 10;
-- bitmap 精确去重(uv)
select
count(distinct user_id) -- 自动转为 bitmap_union
from user_behavior;4.更新与删除(unique key 模型)
-- upsert(通过 stream load 或 routine load) -- 新数据自动覆盖旧主键 -- delete(谨慎使用,仅支持 duplicate/unique 模型) delete from sales where sale_date < '2023-01-01';
四、核心优势 vs 传统 olap
| 能力 | starrocks | hive/spark | clickhouse |
|---|---|---|---|
| 查询延迟 | 亚秒级 | 秒~分钟级 | 亚秒级 |
| 实时更新 | ✅(unique key) | ❌ | ❌(replacingmergetree 有限支持) |
| 标准 sql | ✅(完整 join、子查询) | ✅ | ⚠️(join 性能差) |
| 多表关联 | ✅(shuffle + broadcast) | ✅ | ❌ |
| 物化视图 | ✅(自动匹配) | ❌(需手动) | ✅(但难维护) |
| 运维复杂度 | 低(无依赖) | 高(yarn/hdfs) | 中 |
五、典型应用场景
- 实时大屏:kafka → starrocks → superset/grafana;
- 用户行为分析:埋点日志 → duplicate key 表 → 多维漏斗/留存;
- 广告效果归因:click/impression 表 → bitmap uv → roi 计算;
- 金融风控:交易流水 → unique key → 实时黑名单更新。
六、部署建议(生产环境)
- fe:3 节点(1 leader + 2 follower),8c16g+;
- be:≥3 节点,32c64g+,ssd 存储,万兆网络;
- 监控:集成 prometheus + grafana(starrocks 提供 exporter);
- 备份:通过 export 命令导出到 hdfs/s3。
七、生态集成
- bi 工具:tableau、power bi、superset(通过 mysql 协议连接);
- 数据湖:支持 external catalog(hive/iceberg/hudi);
- 流处理:flink cdc → kafka → routine load;
- 云原生:支持 kubernetes 部署(starrocks operator)。
总结
starrocks = 高性能 + 实时性 + 易用性 + 开源免费
它解决了传统 olap “快而不全”(如 clickhouse)或“全而不快”(如 hive)的痛点,是当前国产开源 olap 引擎的标杆。如果你需要:
- 替代 kylin/druid 的预计算;
- 替代 clickhouse 的复杂分析;
- 构建统一实时数仓,
那么 starrocks 是一个非常值得投入的技术选型。
到此这篇关于starrocks(sr)的基本概念、架构及基本使用介绍的文章就介绍到这了,更多相关starrocks使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论