目錄
一、架構:分布式 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混合架構。