本文最后更新于 2026-08-11T00:39:25+08:00
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 :后台把多个版本的小数据文件合并成大文件,控制文件数与读放大
Doris 的定位一句话:**”能查准的 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) 1 2 3 4 wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.x-bin-x64.tar.gz tar -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
1 2 3 4 meta_dir = /data/doris/meta priority_networks = 10.0.0.0/24 JAVA_OPTS="-Xmx16g -Xms16g"
1 2 3 4 5 6 7 8 fe/bin/start_fe.sh --daemon mysql -h127.0.0.1 -P9030 -uroot mysql> ALTER SYSTEM ADD FOLLOWER "node2:9010" ; mysql> ALTER SYSTEM ADD FOLLOWER "node3:9010" ;
3. BE 部署(3 台) 1 2 3 4 storage_root_path = /data/doris/data1,medium:ssd;/data/doris/data2,medium:hdd priority_networks = 10.0.0.0/24 be_port = 9060
1 2 3 4 5 6 7 be/bin/start_be.sh --daemon mysql> ALTER SYSTEM ADD BACKEND "node1:9050" ; mysql> ALTER SYSTEM ADD BACKEND "node2:9050" ; mysql> ALTER SYSTEM ADD BACKEND "node3:9050" ; mysql> SHOW BACKENDS; mysql> SHOW FRONTENDS;
验证就绪的标准:SHOW BACKENDS 全 Alive、Web UI(8030)可访问、SHOW TABLET 无异常。首次建表会触发 Tablet 均衡,耐心等副本补齐。
4. 建表与导入验证 1 2 3 4 5 6 7 8 9 10 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 16 PROPERTIES ("replication_num" = "3");
1 2 3 4 5 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 数仓查询路径的首选引擎