1336 字
7 分钟
Doris 原理、部署与调优指南
Doris 是 MPP(Massively Parallel Processing,大规模并行处理)分析型数据库,定位”在线报表 + 实时分析”,主打高并发点查与多表 Join。本文覆盖底层原理、集群部署(FE/BE)、参数优化与常见问题,作为湖仓时代 OLAP 引擎的第一块拼图。
底层原理速览
- MPP 架构:一条 SQL 拆成多个子任务在多个 BE 上并行执行,结果汇总返回,吞吐随节点数线性扩展
- FE / BE 分离:FE(Frontend)管元数据、查询规划、导入调度;BE(Backend)管存储与执行
- 列式存储 + 向量化执行:按列存储天然适配分析聚合;SIMD 向量化让单核性能成倍提升
- Tablet 分片:表按分区(Range)+ 分桶(Hash)切成 Tablet,是数据分布、副本与均衡的最小单元
- 多副本 + Quorum:默认 3 副本,写多数派成功即成功,读可走任意副本
- 导入体系:Stream Load(HTTP)、Broker Load(从外部系统)、Routine Load(Kafka 持续消费)、Insert Into
- Compaction:后台把多个版本的小数据文件合并成大文件,控制文件数与读放大
NOTEDoris 的定位一句话:“能查准的 ClickHouse”。它有完善的 SQL/Join/事务语义,不像 Hive 那样重,也不像 ES 那样搜。适合承接”报表、即席分析、实时数仓汇总层”。
部署
1. 规划
| 节点 | 角色 | 数量 | 规格参考(测试/生产) |
|---|---|---|---|
| FE | Leader/Follower/Observer | 1+1+1(生产) | 4C8G / 16C64G(元数据放 SSD) |
| BE | 数据与计算 | 3+ | 8C16G / 32C256G |
- 目录规划:FE 的
meta_dir、BE 的storage_root_path放独立磁盘(SSD) - 端口:FE 9030(MySQL 协议)/ 8030(Web UI)/ 8040(BE 心跳);BE 9060/8040
- 时间同步、关闭 swap、设置
vm.max_map_count(参考调优)
2. FE 部署(部署 3 台,1 Leader + 2 Follower)
# 下载并解压(选择与集群版本一致的稳定版)wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.x-bin-x64.tar.gztar -zxvf apache-doris-*.tar.gz -C /opt && ln -s /opt/apache-doris-* /opt/dorismkdir -p /data/doris/meta && chown -R doris:doris /opt/doris /data/doris# fe/conf/fe.conf 关键项meta_dir = /data/doris/metapriority_networks = 10.0.0.0/24 # 必须显式指定,避免多网卡选错JAVA_OPTS="-Xmx16g -Xms16g" # FE 内存按元数据量给# 第一台:启动并初始化集群fe/bin/start_fe.sh --daemonmysql -h127.0.0.1 -P9030 -uroot # 首次无密码
# 其余两台:加入集群mysql> ALTER SYSTEM ADD FOLLOWER "node2:9010";mysql> ALTER SYSTEM ADD FOLLOWER "node3:9010";# 每台执行 start_fe.sh --helper node1:9010 --daemon 完成加入3. BE 部署(3 台)
# be/conf/be.conf 关键项storage_root_path = /data/doris/data1,medium:ssd;/data/doris/data2,medium:hddpriority_networks = 10.0.0.0/24be_port = 9060# 启动 BE 并加入集群be/bin/start_be.sh --daemonmysql> ALTER SYSTEM ADD BACKEND "node1:9050";mysql> ALTER SYSTEM ADD BACKEND "node2:9050";mysql> ALTER SYSTEM ADD BACKEND "node3:9050";mysql> SHOW BACKENDS; # 全部 Alive 即集群就绪mysql> SHOW FRONTENDS;TIP验证就绪的标准:
SHOW BACKENDS全 Alive、Web UI(8030)可访问、SHOW TABLET无异常。首次建表会触发 Tablet 均衡,耐心等副本补齐。
4. 建表与导入验证
CREATE TABLE dwd_order ( order_id BIGINT NOT NULL, user_id BIGINT, amount DECIMAL(20,2), dt DATE)DUPLICATE KEY(order_id)PARTITION BY RANGE(dt) ()DISTRIBUTED BY HASH(order_id) BUCKETS 16PROPERTIES ("replication_num" = "3");# Stream Load 快速导入(HTTP)curl -u root: --location-trusted \ -H "label:demo_001" -H "column_separator:," \ -T /tmp/order.csv \ http://node1:8030/api/demo/dwd_order/_stream_load调优
1. 内存
| 参数 | 建议 | 说明 |
|---|---|---|
BE mem_limit | 节点物理内存的 60%-70% | BE 进程可用上限 |
BE load_process_max_memory_limit_percent | 50 | 导入占用上限,避免挤占查询 |
FE JAVA_OPTS -Xmx | 按元数据规模 8G-32G | 元数据在 FE 内存 |
查询 exec_mem_limit(会话级) | 按 SQL 复杂度 | 单查询内存上限,防止大查询打爆 BE |
2. Tablet 与 Compaction
- 分桶数:单个 Tablet 数据量控制在 1-10G,桶数 = 数据量 / 单桶目标(如 2G),改小后新分区生效
- Compaction:
compaction_checker_interval_second(默认 10s)、min_compaction_failure_interval_second;大表可调大max_compaction_concurrency(默认 1 即可) - 均衡:
SHOW BACKENDS观察磁盘水位,ADMIN SET FRONTEND CONFIG ("tablet_scheduler_max_balancing_tablets"="200")加快均衡
3. 查询
- 物化视图:高频聚合(如按天 sum)建物化视图,Doris 自动命中,替代手动同步聚合表
- 分桶键选择:高频等值过滤列(如 user_id)作分桶键,Join 时若两边同分桶键可走 Bucket Shuffle 免网络
- Join 优化:小表放右侧(默认 broadcast)、大表间用 shuffle join;
SET enable_cost_based_join_reorder=true - 向量化:默认开启;
SET enable_vectorized_engine=true兜底老版本 - Workload Group:不同业务建不同资源组(CPU/内存/并发配额),避免大查询拖垮在线报表
4. 导入
- Routine Load:Kafka 持续导入是实时数仓标配,
max_routine_load_job_num按需调大;单任务max_batch_rows(默认 20 万)可提升吞吐 - Stream Load:客户端并发 5-10,超并发反而触发导入排队;
strict_mode=true拒绝脏数据 - 小文件:导入频率高导致版本多,配合 compaction 观察
SHOW TABLET的 version 数量
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| BE 显示 Offline | 心跳端口不通、磁盘满、进程挂了 | 检查 9050/8040 连通、SHOW BACKENDS 看 LastStartTime |
| Tablet 状态异常 | 副本数不足或磁盘坏 | ADMIN SHOW REPLICA STATUS 定位,等均衡自动修复 |
| 导入 Label 已存在 | 幂等机制生效 | 换 label 或看是否真的失败需清理 |
| 查询报内存超限 | exec_mem_limit 过小 | 会话级调大,或改 Workload Group |
| 表数据膨胀快 | 分区粒度太细 / 桶数太多 | 分区按周/月,桶数按 1-10G 目标重排 |
总结
- Doris = FE 元数据 + BE 存储执行,MPP + 列存 + 向量化,定位在线分析与实时数仓汇总层
- 部署三步:FE 集群 → BE 集群 → 建表导入验证;
priority_networks和磁盘规划是常见坑 - 调优主线:内存(mem_limit/exec_mem_limit)→ Tablet 与 Compaction → 分桶键与 Join → Workload Group 隔离
- 在底座迭代思路中,Doris 是”湖仓一体”阶段替换 Hive 数仓查询路径的首选引擎
Doris 原理、部署与调优指南
https://chaggle.github.io/posts/2026/08/11/doris-deploy-tuning/