StarRocks 基本概念、架构及使用详解
一、基本概念
1. 核心特点
StarRocks(原名 Doris)是一个现代化的MPP(大规模并行处理)分析型数据库,具有以下特点:
- 高性能:支持实时数据分析,亚秒级查询响应
- 高并发:支持数千并发查询
- 统一架构:同时支持批处理和实时分析
- 易用性:兼容MySQL协议,支持标准SQL
2. 基本概念
表类型
- 明细表:存储原始数据,支持任意维度的查询
- 聚合表:预聚合数据,提高查询性能
- 更新表:支持主键更新,适用于CDC场景
- 主键表:支持高效的Upsert操作
数据模型
- 分区(Partition):按时间或其他维度分区,便于数据管理
- 分桶(Bucket):数据分片,实现并行计算
- 副本(Replica):数据冗余,保证高可用
二、架构设计
1. 三层架构
┌─────────────────────────────────────┐
│ Frontend (FE) │
│ • 查询解析与规划 │
│ • 元数据管理 │
│ • 集群管理 │
└─────────────────────────────────────┘
│
┌─────────────────────────────────────┐
│ Backend (BE) │
│ • 数据存储与计算 │
│ • 数据压缩与索引 │
│ • 查询执行 │
└─────────────────────────────────────┘
│
┌─────────────────────────────────────┐
│ Storage Layer │
│ • 本地存储(BDBJE) │
│ • 云存储(S3/HDFS) │
└─────────────────────────────────────┘
2. 核心组件
Frontend (FE)
- 管理节点:负责元数据管理、查询规划、集群调度
- 支持多FE部署:Leader-Follower模式,保证高可用
- 兼容MySQL协议:可通过标准MySQL客户端连接
Backend (BE)
- 计算存储一体化:每个BE节点既存储数据也执行计算
- 向量化执行引擎:利用SIMD指令优化查询性能
- 智能物化视图:自动查询重写,透明加速
三、基本使用
1. 安装与部署
快速启动(单机测试)
# 下载StarRocks
wget https://releases.starrocks.io/starrocks/STARROCKS_VERSION.tar.gz
# 解压并启动
tar -xzf STARROCKS_VERSION.tar.gz
cd starrocks
# 启动FE
./fe/bin/start_fe.sh --daemon
# 启动BE
./be/bin/start_be.sh --daemon
2. 基础操作
连接数据库
mysql -h 127.0.0.1 -P 9030 -u root
创建数据库
CREATE DATABASE IF NOT EXISTS example_db;
USE example_db;
创建表
-- 创建明细表
CREATE TABLE IF NOT EXISTS user_behavior (
user_id INT,
item_id INT,
category_id INT,
behavior_type VARCHAR(10),
timestamp DATETIME
)
DUPLICATE KEY(user_id, item_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES (
"replication_num" = "1"
);
-- 创建聚合表
CREATE TABLE user_behavior_agg (
user_id INT,
behavior_type VARCHAR(10),
pv BIGINT SUM,
uv BIGINT BITMAP_UNION
)
AGGREGATE KEY(user_id, behavior_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 8;
3. 数据导入
方式1:Stream Load(实时导入)
curl --location-trusted -u root \
-H "label: test_label" \
-H "column_separator: ," \
-T /path/to/data.csv \
http://127.0.0.1:8030/api/example_db/user_behavior/_stream_load
方式2:Broker Load(批量导入)
LOAD LABEL example_db.label1
(
DATA INFILE("hdfs://path/to/data*.csv")
INTO TABLE user_behavior
COLUMNS TERMINATED BY ","
)
WITH BROKER "broker1"
PROPERTIES
(
"timeout" = "3600"
);
方式3:Insert Into
INSERT INTO user_behavior VALUES
(1001, 2001, 101, 'click', '2023-01-01 10:00:00'),
(1002, 2002, 102, 'buy', '2023-01-01 10:05:00');
4. 数据查询
基本查询
-- 明细查询
SELECT user_id, COUNT(*) as pv
FROM user_behavior
WHERE timestamp >= '2023-01-01'
GROUP BY user_id
ORDER BY pv DESC
LIMIT 10;
-- 关联查询
SELECT u.user_id, u.user_name, SUM(o.amount) as total_amount
FROM users u JOIN orders o ON u.user_id = o.user_id
WHERE o.order_date >= '2023-01-01'
GROUP BY u.user_id, u.user_name;
高级功能
-- 窗口函数
SELECT
user_id,
timestamp,
COUNT(*) OVER(PARTITION BY user_id ORDER BY timestamp) as cumulative_pv
FROM user_behavior;
-- 物化视图查询(自动重写)
CREATE MATERIALIZED VIEW user_behavior_mv
AS
SELECT user_id, behavior_type, COUNT(*) as cnt
FROM user_behavior
GROUP BY user_id, behavior_type;
-- 查询会自动使用物化视图加速
SELECT user_id, behavior_type, COUNT(*)
FROM user_behavior
GROUP BY user_id, behavior_type;
5. 表维护
分区管理
-- 添加分区
ALTER TABLE user_behavior ADD PARTITION p202301 VALUES [('2023-01-01'), ('2023-02-01'));
-- 删除分区
ALTER TABLE user_behavior DROP PARTITION p202212;
-- 查看分区信息
SHOW PARTITIONS FROM user_behavior;
数据维护
-- 查看表统计信息
SHOW TABLE STATS user_behavior;
-- 手动收集统计信息
ANALYZE TABLE user_behavior;
-- 数据校验
ADMIN CHECKSUM TABLE user_behavior;
6. 性能优化
建表优化
CREATE TABLE optimized_table (
dt DATE,
user_id BIGINT,
city_id INT,
amount DECIMAL(10,2)
)
ENGINE=olap
DUPLICATE KEY(dt, user_id)
PARTITION BY RANGE(dt) (
PARTITION p202301 VALUES [('2023-01-01'), ('2023-02-01')),
PARTITION p202302 VALUES [('2023-02-01'), ('2023-03-01'))
)
DISTRIBUTED BY HASH(user_id) BUCKETS 32
PROPERTIES (
"storage_medium" = "SSD",
"replication_num" = "3",
"storage_cooldown_time" = "2023-12-31 23:59:59"
);
索引优化
-- 创建BITMAP索引
CREATE INDEX idx_category ON user_behavior(category_id) USING BITMAP;
-- 创建Bloom Filter索引
ALTER TABLE user_behavior SET ("bloom_filter_columns" = "user_id,item_id");
四、最佳实践
1. 数据建模建议
- 时间序列数据:使用分区表,按时间分区
- 高基数维度:使用Bitmap索引加速去重
- 频繁过滤字段:创建Bloom Filter索引
- 大表关联:确保关联键分桶一致
2. 查询优化建议
-- 使用分区裁剪
SELECT * FROM table WHERE dt = '2023-01-01';
-- 避免SELECT *
SELECT column1, column2 FROM table WHERE condition;
-- 使用合适的聚合函数
-- 使用APPROX_COUNT_DISTINCT代替COUNT(DISTINCT)处理大数据量
SELECT APPROX_COUNT_DISTINCT(user_id) FROM large_table;
3. 集群管理
-- 查看集群状态
SHOW PROC '/backends';
SHOW PROC '/frontends';
-- 添加BE节点
ALTER SYSTEM ADD BACKEND "host:port";
-- 负载均衡
ADMIN SET REPLICA STATUS PROPERTIES("tablet_id" = "10001", "backend_id" = "10002", "status" = "ok");
五、监控与故障排查
1. 监控指标
-- 查询性能监控
SHOW PROC '/current_queries';
-- 查看慢查询
SHOW PROC '/slow_queries';
-- 查看表大小
SHOW DATA FROM example_db;
2. 常用诊断命令
# 查看BE日志
tail -f be/log/be.INFO
# 查看FE日志
tail -f fe/log/fe.INFO
# 检查集群健康状态
curl http://fe_host:fe_http_port/api/health
六、生态集成
1. 与数据湖集成
-- 查询Hive表
CREATE EXTERNAL TABLE hive_table
ENGINE=HIVE
PROPERTIES (
"hive.metastore.uris" = "thrift://hive-metastore:9083",
"database" = "hive_db",
"table" = "hive_table"
);
-- 查询Iceberg表
CREATE EXTERNAL TABLE iceberg_table
ENGINE=ICEBERG
PROPERTIES (
"iceberg.catalog.type" = "hive",
"iceberg.catalog.uri" = "thrift://hive-metastore:9083"
);
2. 与BI工具集成
- 支持JDBC/ODBC:可通过标准接口连接Tableau、Power BI等
- 支持Superset:原生连接器
- 支持Grafana:通过MySQL数据源连接
总结
StarRocks作为新一代的MPP数据库,提供了:
极致的性能:向量化引擎+智能物化视图
简单的运维:自动化数据管理,弹性扩展
丰富的生态:兼容多种数据源和BI工具
企业级特性:高可用、数据一致性、安全保障
对于需要实时分析、高并发查询的场景,StarRocks是一个优秀的选择。建议从测试环境开始,逐步验证其在不同工作负载下的表现。