黄即是黄 發表於 2026-1-6 17:14:14

StarRocks(SR)的基本概念、架构及基本使用详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、核心基础概念</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.表模型(Table Model)</a></li><li><a href="#_lab2_0_1">2.分区(Partition)与分桶(Bucket)</a></li><li><a href="#_lab2_0_2">3.物化视图(Materialized View)</a></li><li><a href="#_lab2_0_3">4.向量化引擎 + CBO 优化器</a></li></ul><li><a href="#_label1">二、系统架构(Shared-Nothing MPP)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_4">1.FE(Frontend)&mdash;&mdash; 元数据 &amp; 查询协调</a></li><li><a href="#_lab2_1_5">2.BE(Backend)&mdash;&mdash; 存储 &amp; 计算</a></li></ul><li><a href="#_label2">三、核心使用语法(兼容 MySQL)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_6">1.建表(关键参数)</a></li><li><a href="#_lab2_2_7">2.数据导入</a></li><ul class="third_class_ul"><li><a href="#_label3_2_7_0">方式 1:Stream Load(HTTP 推送)</a></li><li><a href="#_label3_2_7_1">方式 2:Routine Load(Kafka 实时消费)</a></li><li><a href="#_label3_2_7_2">方式 3:Broker Load(从 HDFS/S3 批量导入)</a></li></ul><li><a href="#_lab2_2_8">3.查询示例</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_9">4.更新与删除(Unique Key 模型)</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label3">四、核心优势 vs 传统 OLAP</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">五、典型应用场景</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、部署建议(生产环境)</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">七、生态集成</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">总结</a></li><ul class="second_class_ul"></ul></ul></div><p>StarRocks(原名 <strong>DorisDB</strong>,后开源并更名为 StarRocks)是一款<strong>高性能、实时、MPP(大规模并行处理)架构的现代化分布式 SQL 数据库</strong>,专为 <strong>OLAP(在线分析处理)</strong> 场景设计。它兼容 MySQL 协议,支持标准 SQL,具备亚秒级查询响应能力,适用于实时报表、即席查询、多维分析、用户画像、日志分析等场景。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、核心基础概念</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.表模型(Table Model)</h3>
<p>StarRocks 提供三种数据模型,适应不同业务场景:</p>
<table><thead><tr><th>模型</th><th>适用场景</th><th>特点</th></tr></thead><tbody><tr><td><strong>Aggregate Key(聚合模型)</strong></td><td>预聚合指标(如 sum、count)</td><td>相同 key 的 value 自动聚合(如 sum(clicks))</td></tr><tr><td><strong>Unique Key(唯一主键模型)</strong></td><td>实时更新、主键去重</td><td>支持 <strong>Upsert</strong>,类似 Hudi/Iceberg 的主键更新</td></tr><tr><td><strong>Duplicate Key(明细模型)</strong></td><td>日志、事件流等原始明细</td><td>不聚合,保留所有记录,支持排序键加速查询</td></tr></tbody></table>
<blockquote><p>✅ <strong>推荐</strong>:</p>
<ul><li>实时数仓 &rarr; <strong>Unique Key</strong>(支持 CDC 更新)</li><li>报表聚合 &rarr; <strong>Aggregate Key</strong></li><li>原始日志 &rarr; <strong>Duplicate Key</strong></li></ul></blockquote>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2.分区(Partition)与分桶(Bucket)</h3>
<ul><li><strong>分区(Partition)</strong>:按时间/地域等逻辑切分数据(如 <code>PARTITION BY RANGE(date)</code>),用于<strong>分区裁剪</strong>。</li><li><strong>分桶(Bucket)</strong>:每个分区内按 <strong>Hash(分桶列)</strong> 分成多个 Tablet(物理存储单元),实现<strong>并行计算</strong>。</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 示例:按天分区,按 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;</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3.物化视图(Materialized View)</h3>
<ul><li><strong>自动构建预聚合索引</strong>,加速特定查询模式;</li><li>查询时自动路由到最优物化视图(无需改写 SQL);</li><li>支持 <strong>Rollup</strong>(上卷)、<strong>Bitmap 精确去重</strong>、<strong>HLL 近似去重</strong>。</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 创建物化视图:按天统计 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);</pre></div>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>4.向量化引擎 + CBO 优化器</h3>
<ul><li><strong>向量化执行</strong>:一次处理 1024 行,大幅提升 CPU 利用率;</li><li><strong>基于成本的优化器(CBO)</strong>:自动选择最优 Join 顺序、索引、聚合策略;</li><li>支持 <strong>Runtime Filter</strong>、<strong>Predicate Pushdown</strong> 等高级优化。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、系统架构(Shared-Nothing MPP)</h2>
<p>StarRocks 采用 <strong>无共享(Shared-Nothing)</strong> 架构,主要包含两类节点:</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>1.FE(Frontend)&mdash;&mdash; 元数据 &amp; 查询协调</h3>
<ul><li><strong>角色</strong>:
<ul><li><strong>Leader FE</strong>:管理元数据(表结构、分区信息)、选举主节点;</li><li><strong>Follower FE</strong>:参与元数据写入(多数派共识);</li><li><strong>Observer FE</strong>:只读副本,提升高并发查询能力。</li></ul></li><li><strong>功能</strong>:<ul><li>SQL 解析、查询计划生成;</li><li>集群管理、负载均衡;</li><li>兼容 MySQL 协议(客户端直连 FE)。</li></ul></li></ul>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>2.BE(Backend)&mdash;&mdash; 存储 &amp; 计算</h3>
<ul><li>负责数据存储(Tablet)、本地计算、向量化执行;</li><li>数据在 BE 上以 <strong>列式存储(Column-Oriented)</strong>,支持 Parquet-like 编码;</li><li>自动副本管理(默认 3 副本),支持跨机架容灾。</li></ul>
<div class="jb51code"><pre class="brush:sql;">+---------------------+
|   Client (MySQL)|
+----------+----------+
         |
   +-----v-----+
   |   FE (SQL解析, 优化)|
   +-----+-----+
         |
   +-------v--------+       +------------------+
   | BE1 (Tablet A) | &lt;---&gt; | BE2 (Tablet B)   |
   +----------------+       +------------------+
         |                        |
   +-------v--------+       +------v-----------+
   | BE3 (副本)      |       | BE4 (副本)      |
   +----------------+       +------------------+
</pre></div>
<blockquote><p>✅ <strong>优势</strong>:</p>
<ul><li>无单点瓶颈,横向扩展;</li><li>计算靠近数据(Data Locality);</li><li>自动故障恢复。</li></ul></blockquote>
<p class="maodian"><a name="_label2"></a></p><h2>三、核心使用语法(兼容 MySQL)</h2>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>1.建表(关键参数)</h3>
<div class="jb51code"><pre class="brush:sql;">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"
);</pre></div>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>2.数据导入</h3>
<p class="maodian"><a name="_label3_2_7_0"></a></p><h4>方式 1:Stream Load(HTTP 推送)</h4>
<div class="jb51code"><pre class="brush:sql;">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
</pre></div>
<p class="maodian"><a name="_label3_2_7_1"></a></p><h4>方式 2:Routine Load(Kafka 实时消费)</h4>
<div class="jb51code"><pre class="brush:sql;">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"
);
</pre></div>
<p class="maodian"><a name="_label3_2_7_2"></a></p><h4>方式 3:Broker Load(从 HDFS/S3 批量导入)</h4>
<div class="jb51code"><pre class="brush:sql;">LOAD LABEL db.load_hdfs_001
(DATA INFILE("hdfs://path/to/data.parquet")
INTO TABLE sales
FORMAT AS "parquet")
WITH BROKER "my_broker";
</pre></div>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>3.查询示例</h3>
<div class="jb51code"><pre class="brush:sql;">-- 多表 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 &gt;= '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;</pre></div>
<p class="maodian"><a name="_lab2_2_9"></a></p><h3>4.更新与删除(Unique Key 模型)</h3>
<div class="jb51code"><pre class="brush:sql;">-- Upsert(通过 Stream Load 或 Routine Load)
-- 新数据自动覆盖旧主键
-- Delete(谨慎使用,仅支持 Duplicate/Unique 模型)
DELETE FROM sales WHERE sale_date &lt; '2023-01-01';</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、核心优势 vs 传统 OLAP</h2>
<table><thead><tr><th>能力</th><th>StarRocks</th><th>Hive/Spark</th><th>ClickHouse</th></tr></thead><tbody><tr><td><strong>查询延迟</strong></td><td>亚秒级</td><td>秒~分钟级</td><td>亚秒级</td></tr><tr><td><strong>实时更新</strong></td><td>✅(Unique Key)</td><td>❌</td><td>❌(ReplacingMergeTree 有限支持)</td></tr><tr><td><strong>标准 SQL</strong></td><td>✅(完整 JOIN、子查询)</td><td>✅</td><td>⚠️(JOIN 性能差)</td></tr><tr><td><strong>多表关联</strong></td><td>✅(Shuffle + Broadcast)</td><td>✅</td><td>❌</td></tr><tr><td><strong>物化视图</strong></td><td>✅(自动匹配)</td><td>❌(需手动)</td><td>✅(但难维护)</td></tr><tr><td><strong>运维复杂度</strong></td><td>低(无依赖)</td><td>高(YARN/HDFS)</td><td>中</td></tr></tbody></table>
<p class="maodian"><a name="_label4"></a></p><h2>五、典型应用场景</h2>
<ol><li><strong>实时大屏</strong>:Kafka &rarr; StarRocks &rarr; Superset/Grafana;</li><li><strong>用户行为分析</strong>:埋点日志 &rarr; Duplicate Key 表 &rarr; 多维漏斗/留存;</li><li><strong>广告效果归因</strong>:Click/Impression 表 &rarr; Bitmap UV &rarr; ROI 计算;</li><li><strong>金融风控</strong>:交易流水 &rarr; Unique Key &rarr; 实时黑名单更新。</li></ol>
<p class="maodian"><a name="_label5"></a></p><h2>六、部署建议(生产环境)</h2>
<ul><li><strong>FE</strong>:3 节点(1 Leader + 2 Follower),8C16G+;</li><li><strong>BE</strong>:&ge;3 节点,32C64G+,SSD 存储,万兆网络;</li><li><strong>监控</strong>:集成 Prometheus + Grafana(StarRocks 提供 exporter);</li><li><strong>备份</strong>:通过 EXPORT 命令导出到 HDFS/S3。</li></ul>
<p class="maodian"><a name="_label6"></a></p><h2>七、生态集成</h2>
<ul><li><strong>BI 工具</strong>:Tableau、Power BI、Superset(通过 MySQL 协议连接);</li><li><strong>数据湖</strong>:支持 External Catalog(Hive/Iceberg/Hudi);</li><li><strong>流处理</strong>:Flink CDC &rarr; Kafka &rarr; Routine Load;</li><li><strong>云原生</strong>:支持 Kubernetes 部署(StarRocks Operator)。</li></ul>
<p class="maodian"><a name="_label7"></a></p><h2>总结</h2>
<blockquote><p><strong>StarRocks = 高性能 + 实时性 + 易用性 + 开源免费</strong></p></blockquote>
<p>它解决了传统 OLAP &ldquo;快而不全&rdquo;(如 ClickHouse)或&ldquo;全而不快&rdquo;(如 Hive)的痛点,是当前<strong>国产开源 OLAP 引擎的标杆</strong>。如果你需要:</p>
<ul><li>替代 Kylin/Druid 的预计算;</li><li>替代 ClickHouse 的复杂分析;</li><li>构建统一实时数仓,</li></ul>
<p>那么 <strong>StarRocks 是一个非常值得投入的技术选型</strong>。</p>
頁: [1]
查看完整版本: StarRocks(SR)的基本概念、架构及基本使用详解