1. 为什么选择Apache Doris?
第一次接触Apache Doris是在2020年一个电商数据分析项目中。当时我们需要处理每天TB级的用户行为数据,尝试过多个OLAP引擎后,最终被Doris的实时分析能力和易用性所折服。经过三年多的实战,我总结出这套从安装到调优的完整指南。
Doris作为MPP架构的列式存储系统,最大的特点是同时支持高并发的点查询和复杂的Ad-hoc分析。相比其他开源OLAP方案,它的优势在于:
- 极简的架构设计(FE+BE),运维成本低
- 兼容MySQL协议,学习曲线平缓
- 支持实时数据摄入和更新
- 完善的SQL功能支持
2. 环境准备与安装部署
2.1 硬件配置建议
在生产环境中,我们建议采用以下配置:
- FE节点:16核32GB内存(至少3个节点组成高可用)
- BE节点:32核128GB内存 + NVMe SSD(建议每个节点12-24块盘)
重要提示:BE节点务必禁用swap,避免GC时性能抖动。可以通过
sudo swapoff -a永久关闭。
2.2 安装步骤详解
以CentOS 7为例,完整安装流程如下:
- 下载二进制包(当前稳定版2.0.5):
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0.5-bin-x64.tar.gz- 解压并部署FE节点:
tar -zxvf apache-doris-2.0.5-bin-x64.tar.gz cd apache-doris-2.0.5/fe ./bin/start_fe.sh --daemon- 添加BE节点(在每个BE服务器执行):
cd apache-doris-2.0.5/be ./bin/start_be.sh --daemon- 通过MySQL客户端连接并完成集群初始化:
-- 添加BE节点 ALTER SYSTEM ADD BACKEND "be_host:9050"; -- 创建测试数据库 CREATE DATABASE demo;3. 核心配置调优实战
3.1 内存管理优化
Doris最关键的调优参数集中在内存管理上。经过多次压测,我们总结出以下黄金配置:
-- BE节点配置(be.conf) mem_limit=80% # 物理内存的80% storage_page_cache_limit=40% # 存储层PageCache大小 disable_storage_page_cache=false -- 查询内存限制(fe.conf) query_mem_limit=8589934592 # 8GB per query踩坑记录:曾经将mem_limit设为90%,导致频繁OOM。建议保留20%内存给操作系统和其他进程。
3.2 并行查询优化
对于大型集群,合理设置并行度能显著提升查询性能:
-- 设置全局并行度(建议BE节点数*核数的1/2) set global parallel_fragment_exec_instance_num=16; -- 大表扫描优化 set global exec_mem_limit=10737418240; # 10GB实测案例:在32核BE节点上,将并行度从8提升到16后,一个10亿条数据的聚合查询耗时从12.3s降至6.8s。
4. 表设计与数据摄入技巧
4.1 分区与分桶策略
合理的分区分桶设计是性能基础。我们的电商项目采用以下方案:
CREATE TABLE user_behavior ( user_id BIGINT, item_id BIGINT, action_time DATETIME ) PARTITION BY RANGE(action_time) ( PARTITION p202301 VALUES LESS THAN ('2023-02-01'), PARTITION p202302 VALUES LESS THAN ('2023-03-01') ) DISTRIBUTED BY HASH(user_id) BUCKETS 32 PROPERTIES ( "replication_num" = "3", "storage_medium" = "SSD" );分桶数量经验公式:BE节点数 * 磁盘数 * 2。例如6个BE节点,每个节点12块盘,则建议144个桶。
4.2 实时数据摄入方案
我们对比过三种摄入方式:
- Routine Load:最适合Kafka数据流
CREATE ROUTINE LOAD demo.user_behavior_load ON user_behavior COLUMNS(user_id, item_id, action_time) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092", "kafka_topic" = "user_events" ); - Stream Load:适合程序化写入
- Insert Into:小批量数据测试用
实测Routine Load在10万QPS下平均延迟仅2-3秒。
5. 常见问题排查指南
5.1 查询卡顿分析
当遇到查询变慢时,按以下步骤排查:
- 检查BE节点内存:
curl http://be_host:8040/api/mem_info - 查看慢查询日志:
SHOW PROC '/current_queries'; - 分析Profile:
EXPLAIN ANALYZE SELECT COUNT(*) FROM large_table;
5.2 数据倾斜处理
我们曾遇到过分桶严重倾斜的情况(某个桶数据量是其他的50倍)。解决方案:
-- 1. 重建分桶键(增加随机后缀) ALTER TABLE user_behavior MODIFY DISTRIBUTION BY HASH(user_id, FLOOR(RAND()*10)) BUCKETS 32; -- 2. 手动均衡数据 ADMIN SET FRONTEND CONFIG ("enable_rebalance" = "true");6. 监控与运维实践
6.1 关键监控指标
我们使用Prometheus+Grafana监控以下核心指标:
| 指标名称 | 告警阈值 | 说明 |
|---|---|---|
| be_mem_usage_ratio | >85% | BE内存使用率 |
| fe_qps | >5000 | 前端查询压力 |
| tablet_num_per_be | >50000 | 单BE Tablet数量 |
6.2 日常维护命令
每周必做的维护操作:
-- 检查副本健康状态 ADMIN SHOW REPLICA STATUS WHERE STATUS != "OK"; -- 手动Compaction(针对频繁更新表) ALTER TABLE hot_table COMPACT;三年运维下来最大的体会是:Doris的稳定性远超预期,但必须提前做好容量规划。我们曾因低估数据增长导致紧急扩容,教训深刻。建议保持20%以上的存储和计算余量。