
StarRocks(SR)的基本概念、架构及基本使用详解
一、 StarRocks基本概念
StarRocks(简称SR)是一款高性能、全场景的MPP(Massively Parallel Processing)分布式分析型数据库。它支持实时、亚秒级的分析查询,特别擅长处理多维分析、实时数仓和Ad-hoc查询等场景。StarRocks兼容MySQL协议,使得开发和迁移成本极低。
核心特性:
极速分析:采用向量化执行引擎、CBO(基于代价的优化器)以及全局字典等技术,在宽表和多表关联场景下表现优异。
实时更新:支持主键模型(Primary Key Model),实现秒级的实时数据更新与删除,同时保证极高的查询性能。
湖仓一体:不仅能管理本地数据,还能作为计算引擎直接查询Hive、Iceberg、Hudi、Delta Lake等外部数据湖的数据。
标准兼容:高度兼容MySQL协议,支持标准SQL,可通过各类MySQL客户端和BI工具直接接入。
二、 StarRocks架构详解
StarRocks采用了原生MPP架构,整个系统没有单点故障,主要由FE(Frontend)和BE(Backend)两类进程组成。
1. FE(Frontend)节点
FE是StarRocks的前端节点,负责元数据管理、客户端连接管理、查询解析、查询计划生成以及查询调度。FE节点分为三种角色:
Leader:主节点,由Follower选举产生,负责元数据的写入和同步。
Follower:从节点,参与Leader选举。当Leader宕机时,Follower会自动选举出新的Leader,保证高可用。
Observer:观察者节点,不参与选举,只负责同步Leader的元数据,用于扩展FE的查询并发能力。
2. BE(Backend)节点
BE是StarRocks的后端节点,负责数据存储和查询计划的执行。BE采用无主架构,所有BE节点对等。数据会按照分片机制分布在多个BE节点上,通过多副本机制保证数据的高可靠。BE直接读写本地数据,并利用MPP网络在节点间进行数据交换完成复杂查询。
3. 数据管理机制
StarRocks的逻辑结构依次为:数据库 > 表 > 分区 > 分桶。
分区:通常按时间维度进行分区,便于数据生命周期管理(如按天/月删除过期数据)。
分桶:在分区内,数据通过哈希算法分散到不同的Bucket中,分桶键的选择决定了数据分布的均匀性和查询时的剪枝效率。
三、 StarRocks基本使用
由于StarRocks兼容MySQL协议,你可以使用任意MySQL客户端(如Navicat、DBeaver或命令行mysql)连接StarRocks的FE节点(默认端口9030)。
1. 建库与建表
StarRocks支持四种数据模型:明细模型、聚合模型、更新模型和主键模型。其中主键模型非常适合实时更新场景。以下示例创建一个按日期分区、按用户ID分桶的主键模型表:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS sr_demo;
USE sr_demo;
-- 创建主键模型表
CREATE TABLE IF NOT EXISTS user_events (
event_date DATE NOT NULL COMMENT '事件日期',
user_id BIGINT NOT NULL COMMENT '用户ID',
event_type VARCHAR(64) NOT NULL COMMENT '事件类型',
event_detail JSON COMMENT '事件详情(JSON)',
update_time DATETIME NOT NULL COMMENT '更新时间'
)
ENGINE = OLAP
PRIMARY KEY(event_date, user_id)
COMMENT '用户事件主键表'
PARTITION BY RANGE(event_date) (
START ("2023-01-01") END ("2024-01-01") EVERY (INTERVAL 1 MONTH)
)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES (
"replication_num" = "3",
"enable_persistent_index" = "true"
);2. 数据导入
StarRocks提供多种导入方式,包括Stream Load、Broker Load、Routine Load等。最常用于实时流写入的是Stream Load,它通过HTTP协议将本地或内存中的数据推送到SR。
# 使用curl命令进行Stream Load导入CSV格式数据 curl --location-trusted -u root: -H "label:user_event_load_001" -H "column_separator:," -H "columns:event_date,user_id,event_type,event_detail,update_time" -T data.csv http://www.ipipp.com:8040/api/sr_demo/user_events/_stream_load
如果是实时数仓同步,通常会使用Flink通过StarRocks Connector以JSON格式写入,此时只需在Flink任务中配置好连接器参数即可。
3. 数据查询与分析
查询方式与标准SQL完全一致,支持聚合、多表Join、窗口函数等复杂操作:
-- 查询每日不同事件类型的UV和PV SELECT event_date, event_type, COUNT(DISTINCT user_id) AS uv, COUNT(*) AS pv FROM user_events WHERE event_date >= '2023-10-01' GROUP BY event_date, event_type ORDER BY event_date DESC, uv DESC;
4. 物化视图加速
面对极高频的查询且聚合逻辑固定时,可以创建物化视图来预计算,实现查询透明加速:
-- 创建按事件类型预聚合的物化视图 CREATE MATERIALIZED VIEW mv_event_type_agg AS SELECT event_date, event_type, COUNT(DISTINCT user_id) AS uv, COUNT(*) AS pv FROM user_events GROUP BY event_date, event_type;
创建成功后,当用户再次执行上述包含`COUNT(DISTINCT user_id)`和`GROUP BY event_date, event_type`的查询时,CBO优化器会自动将查询改写为命中物化视图,从而实现毫秒级响应。
通过以上对StarRocks概念、架构及核心操作的梳理,可以快速将其应用于实时数仓建设、OLAP分析等生产场景,充分发挥其高并发、低延迟的算力优势。