当业务报表从”昨天的离线统计”变成”此刻的实时大盘”,传统 MySQL 聚合查询往往直接被打垮。Apache Doris 是一款开源的实时 OLAP(联机分析处理)数据库,凭借 MPP 架构和列式存储,能在亿级数据上做到亚秒级响应。本文从架构原理到生产落地,完整讲清 Doris 怎么用、什么时候该用它。
一、Doris 是什么,解决了什么痛点
OLAP 场景的核心是”写少读多、聚合为主”。如果你用 MySQL 跑 GROUP BY 扫几千万行,结果不是慢,就是直接把线上库拖垮。比如一张 5 亿行的用户行为表,MySQL 做一次”按天、按渠道统计 UV”的聚合可能要几十秒,而 Doris 通常在几百毫秒内返回——差距不是一个数量级,而是能否支撑”交互式分析”的生死线。
它的定位介于”事务库”和”数仓”之间:比 MySQL 更适合分析,比 Hadoop/Spark 更轻、查询更快,又比 ClickHouse 更偏向高并发”点查 + 多维分析”兼顾。和我们已经讲过的 TimescaleDB(PostgreSQL 时序扩展)、InfluxDB(独立时序库) 相比,Doris 在”宽表多维分析 + 高并发即席查询”上更均衡,是实时数仓的热门选择。
| 场景 | MySQL | ClickHouse | Doris |
|---|---|---|---|
| 5 亿行聚合 | 几十秒 | 亚秒 | 亚秒 |
| 高并发点查 | 强 | 一般 | 强 |
| 多表 JOIN | 强 | 弱 | 较强 |
| 运维复杂度 | 低 | 中 | 中 |
二、核心架构:FE 与 BE 分工
Doris 采用两层架构,理解它就理解了 Doris 的伸缩能力:
- Frontend(FE):负责元数据管理、SQL 解析、查询规划、集群调度与高可用。FE 又分为 Leader/Follower/Observer,通过类 Paxos 协议保证元数据一致。
- Backend(BE):负责数据的实际存储与计算执行。BE 越多,存储与算力越横向扩展,查询自然越快。
一句话记忆:FE 管”怎么算”,BE 管”算什么、存哪里”。生产环境建议至少 1 个 FE(高可用则 3 个)+ 3 个 BE,形成稳定的最小集群。FE 的 Web UI(默认 8030 端口)能直观看到节点状态、查询概况和导入任务,是日常巡检的第一入口。
三、用 Docker Compose 快速起一套集群
本地验证或测试环境,用 Docker 起一套”1 FE + 3 BE”最直观。下面这份 docker-compose.yml 直接可用(生产请把数据目录挂到独立盘):
version: "3"
services:
fe:
image: apache/doris:2.1.0-fe
environment:
- FE_ROLE=leader
ports:
- "8030:8030" # Web UI
- "9030:9030" # MySQL 协议端口
volumes:
- ./fe:/opt/apache-doris/fe/doris-meta
be:
image: apache/doris:2.1.0-be
depends_on:
- fe
volumes:
- ./be:/opt/apache-doris/be/storage
容器起来后,用 MySQL 客户端连 9030 端口,把 BE 加进集群即可(Doris 兼容 MySQL 协议,这是它上手友好的关键):
mysql -h 127.0.0.1 -P 9030 -u root
ALTER SYSTEM ADD BACKEND "be:9050";
SHOW BACKENDS\G -- 看到 Alive: true 即就绪
想在 CI 里自动验证 Doris 连通性,可把它写进 GitHub Actions 流水线,和我们之前聊的自动化发布思路一致。
四、数据模型:选对 Key 类型事半功倍
Doris 提供三种数据模型,选错会直接影响查询性能与存储成本:
| 模型 | 适用场景 | 特点 |
|---|---|---|
| Duplicate Key | 明细查询、日志分析 | 保留全部明细,按前缀索引加速 |
| Aggregate Key | 报表预聚合 | 写入时自动 SUM/MAX,存储大幅压缩 |
| Unique Key | 需要更新/修正的数据 | 相同 Key 后写覆盖前写,支持 UPSERT |
以最常见的”用户行为明细”为例,建一张 Duplicate Key 表:
CREATE TABLE user_event (
event_date DATE,
user_id BIGINT,
event_type VARCHAR(32),
cnt INT
)
DUPLICATE KEY(event_date, user_id)
PARTITION BY RANGE(event_date) ()
DISTRIBUTED BY HASH(user_id) BUCKETS 16
PROPERTIES ("replication_num" = "3");
DISTRIBUTED BY HASH 的分桶键要选高基数字段(如 user_id),避免数据倾斜;replication_num 一般设为 BE 数量或 3。如果你的数据天然需要更新(如订单状态变更),则改用 Unique Key 模型,Doris 会在后台做版本合并,对外呈现最新值。
五、数据导入:三种常用方式
Doris 的导入生态很完整,按需选择:
- Stream Load:本地文件 / 程序实时推,适合中小批量,用 HTTP 即可。
- Routine Load:订阅 Kafka 持续消费,最适合实时数仓。
- Broker Load:从 HDFS / S3 / 对象存储批量拉,适合 TB 级初始化。
下面这条 Routine Load 让 Doris 自动从 Kafka 消费用户行为并入库:
CREATE ROUTINE LOAD kafka_user_event ON user_event
COLUMNS(user_id, event_type, cnt, event_date)
PROPERTIES (
"format" = "json",
"desired_concurrent_number" = "3"
)
FROM KAFKA (
"kafka_broker_list" = "broker1:9092,broker2:9092",
"kafka_topic" = "user_event",
"kafka_offset" = "latest"
);
创建后用 SHOW ROUTINE LOAD 观察进度,重点关注 StatusCode 是否 RUNNING、消费延迟是否可控。导入失败多数源于字段映射或格式不匹配,先在测试表小批量试跑再上生产。
六、高并发查询优化实战
表建好后,查询性能主要靠这几招提升:
| 手段 | 作用 | 注意点 |
|---|---|---|
| 合理分桶 | 数据均匀分布、并行扫描 | 桶数 = BE 核数的 1~2 倍 |
| 前缀索引 | 加速按 Key 过滤 | 把高频过滤列放 Key 前面 |
| Rollup / 物化视图 | 预聚合热门维度 | 只对高频查询建,避免写放大 |
比如给明细表加一个按 event_type 预聚合的 Rollup,报表查询直接从聚合结果读,速度提升一个数量级:
ALTER TABLE user_event
ADD ROLLUP rollup_type(event_date, event_type, cnt);
如果你的查询慢,先别急着加机器,优先看执行计划(EXPLAIN)是否命中了前缀索引和分桶裁剪——这点排查思路和我们在 PostgreSQL 慢查询优化 里讲的”先定位再调优”完全一致。一个典型的多维查询长这样:
SELECT event_date, event_type, SUM(cnt) AS total
FROM user_event
WHERE event_date BETWEEN '2026-09-01' AND '2026-09-30'
GROUP BY event_date, event_type
ORDER BY total DESC
LIMIT 20;
七、Doris 与周边数据栈怎么协同
真实架构里,Doris 通常不是孤岛:业务数据往往先在 MySQL 主从复制 的从库沉淀,再通过 CDC 或 Routine Load 流入 Doris 做实时分析;分析结论又能回流到应用层支撑实时大屏。若你的源库是 PostgreSQL,可以参考 PostgreSQL 逻辑复制 把变更投递到消息队列,再喂给 Doris。这种”事务库沉淀 + 分析库加速”的分层,既能保住在线事务性能,又能让分析师随意即席查询而不影响业务。
八、常见运维问题与排查
- BE 显示 Alive: false:先查 BE 日志里的磁盘空间与端口,通常是存储目录权限或 9050 端口不通。
- 导入任务卡住:看
SHOW LOAD的 ErrorMsg,多为字段类型不匹配或分区不存在。 - 查询变慢:确认是否触发了 Compaction 积压,FE UI 的”Tablet 状态”能看出副本不均衡。
- 副本缺失:用
ADMIN REPAIR TABLE触发修复,并排查 BE 是否曾宕机。
把这几条做成巡检脚本,配合 FE/BE 暴露的 Prometheus 指标,能在故障影响业务前提前告警。
九、生产落地的几个建议
- 容量规划:单 BE 建议 16 核 64G 起步,磁盘用 SSD;副本数 3 保证高可用。
- 监控不能少:FE/BE 都暴露 Prometheus 指标,配合告警提前发现 Compaction 积压。
- 小步升级:Doris 迭代快,跨大版本前务必在测试集群验证,避免元数据不兼容。
- 导入限速:大批量初始化用 Broker Load,避开业务高峰,防止占用查询资源。
总的来说,Apache Doris 用”MySQL 协议 + MPP + 列式存储”的组合,把实时数仓的门槛拉得很低。如果你的场景是报表、即席分析、用户行为洞察,又不想维护一套笨重的 Hadoop,Doris 值得放进技术选型清单。从 Docker 起一套三节点集群开始,跑通导入和查询,你就能直观感受到它”亿级数据亚秒返回”的爽感。




