目录
一、架构:分布式 MPP + 列式存储 + 向量化引擎
二、存储:高性能列式存储引擎
三、表设计:三类模型适配不同场景
四、数据写入:多种方式支持实时与批量
五、数据读取:极致优化的查询引擎
总结:StarRocks的核心优势
以下是StarRocks核心概念的详细解析,涵盖架构、存储、表设计、数据写入与读取:
一、架构:分布式 MPP + 列式存储 + 向量化引擎
- FE (Frontend) 节点
-
- 职责:元数据管理、SQL解析、查询优化、查询调度、集群管理、身份认证。
- 高可用:基于类Raft协议(BDBJE)实现Leader/Follower/Observer多角色,确保元数据强一致性与故障自动切换。
- 优化器:采用CBO(Cost-Based Optimizer),基于精准统计信息(表/列/分区分桶)生成最优执行计划,支持复杂谓词下推、Join重排序、物化视图改写。
- BE (Backend) 节点
-
- 职责:数据存储、SQL执行、数据压缩、副本管理。
- 分布式执行:采用MPP(Massively Parallel Processing)架构,将查询拆解为多个物理算子(Scan/Aggregation/Join等),在BE节点间并行执行。
- 向量化引擎:数据按列批量处理(每批1024行),利用CPU SIMD指令(如AVX2)提升计算效率,减少虚函数调用。
二、存储:高性能列式存储引擎
- 列式存储
-
- 数据按列组织,独立压缩与编码,减少I/O量(仅读取查询涉及的列)。
- 高效压缩:支持Zstandard/LZ4/Snappy等算法,结合字典编码、位图编码、Run-Length Encoding(RLE),压缩比达5~10倍。
- 智能索引
-
- 前缀索引:每1024行构成一个数据块(Segment),按表的前36字节自动生成前缀索引,加速等值/范围查询。
- Bloom Filter索引:对高基数列(如UserID)构建,快速过滤不匹配的数据块。
- ZoneMap索引:存储每个数据块的列值Min/Max,用于分区剪枝和范围过滤。
- 数据分区分桶
-
- 分区 (Partitioning):按时间/枚举值划分(如
PARTITION BY dt
),实现分区剪枝,减少扫描量。 - 分桶 (Bucketing):对分区内数据哈希分桶(如
DISTRIBUTED BY HASH(user_id) BUCKETS 10
),确保数据均匀分布,优化Join/聚合性能。
- 分区 (Partitioning):按时间/枚举值划分(如
- 多副本机制
-
- 基于Multi-Raft协议实现副本强一致,支持3副本(默认),自动修复副本故障。
三、表设计:三类模型适配不同场景
- 明细模型 (Duplicate Key Model)
-
- 适用场景:日志、行为流水等原始数据存储。
- 特点:无主键,按导入批次存储全量明细数据,支持任意列排序键(如
DUPLICATE KEY(event_time, user_id)
)。
- 聚合模型 (Aggregate Key Model)
-
- 适用场景:预聚合报表(如PV/UV/GMV)。
- 特点:定义主键(维度列)与聚合函数(指标列),如:
CREATE TABLE agg_table (dt DATE,user_id BIGINT,pv BIGINT SUM, -- 自动求和uv BIGINT REPLACE -- 仅保留最新值
) AGGREGATE KEY(dt, user_id);
- 更新模型/主键模型 (Unique Key Model / Primary Key Model)
-
- 适用场景:需要按主键更新的场景(如用户画像)。
- 特点:
-
-
- 更新模型:定义主键,相同主键新数据覆盖旧数据(Merge-on-Read)。
- 主键模型:基于主键索引(内存/磁盘)实现Delete+Insert,支持实时更新(2.3+版本)。
-
四、数据写入:多种方式支持实时与批量
- Stream Load
-
- HTTP协议推送CSV/JSON数据,适用于实时小批量写入(毫秒级延迟)。
- 示例:
curl -X POST -u root: -T data.csv http://fe_host:8030/api/db/table/_stream_load
- Routine Load
-
- 持续消费Kafka消息,自动提交偏移量,保障Exactly-Once语义。
- 示例:
CREATE ROUTINE LOAD job_name ON table_name
PROPERTIES ("format"="json")
FROM KAFKA ( "kafka_broker_list"="broker1:9092", "kafka_topic"="topic_name");
- Broker Load
-
- 通过Broker进程(HDFS/S3)批量导入Parquet/ORC文件,适合TB级数据迁移。
- 示例:
LOAD LABEL label_name (DATA INFILE("hdfs://path/*.parquet")INTO TABLE target_table
) WITH BROKER "broker_name";
- Spark/Flink Connector
-
- 通过标准接口与大数据生态集成,支持Structed Streaming/Flink SQL写入。
五、数据读取:极致优化的查询引擎
- MPP并行计算
-
- 查询被拆解为物理计划,在多个BE节点并行执行,节点间通过Shuffle Exchange数据。
- 智能优化技术
-
- 局部聚合:在数据分桶内预聚合,减少Shuffle数据量。
- Runtime Filter:动态生成Bloom Filter/MinMax Filter,下推至Scan节点过滤数据。
- Join优化:支持Broadcast Join(小表)、Shuffle Join(大表)、Colocate Join(同分桶表免Shuffle)。
- 物化视图 (Materialized View)
-
- 预计算聚合结果,查询自动路由至物化视图,加速响应。
- 示例:创建小时级聚合视图,原始表按分钟存储。
CREATE MATERIALIZED VIEW mv_hourly
AS SELECT dt, hour, user_id, SUM(pv)
FROM base_table GROUP BY dt, hour, user_id;
总结:StarRocks的核心优势
- 实时分析:秒级数据可见性,亚秒级查询响应。
- 高并发:向量化引擎+多级缓存(PageCache/DataCache)支持数千QPS。
- 易用性:兼容MySQL协议,支持标准SQL/BI工具。
- 成本效益:高压缩比+高效存储格式,降低存储与计算成本。
通过以上设计,StarRocks在实时数仓、交互式分析、高并发报表等场景表现卓越,适合替代传统Hadoop+MPP混合架构。