1. Doris数据分布策略概述
Apache Doris作为一款高性能MPP分析型数据库,其数据分布策略直接决定了查询性能与系统稳定性。在实际生产环境中,合理设计分区分桶方案能够将查询延迟降低50%以上,同时避免数据倾斜导致的节点过载问题。
2. 分区设计原理与实践
2.1 分区核心机制
Doris支持两种分区类型:
- Range分区:按连续值范围划分(日期/数值)
PARTITION BY RANGE(`date`)( PARTITION `p202301` VALUES LESS THAN ("2023-02-01"), PARTITION `p202302` VALUES LESS THAN ("2023-03-01") )- List分区:按离散值集合划分
PARTITION BY LIST(`city`)( PARTITION `p_east` VALUES IN ("shanghai","hangzhou"), PARTITION `p_west` VALUES IN ("chengdu","xian") )2.2 动态分区管理
通过PROPERTIES配置自动维护时间分区:
"dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-7", "dynamic_partition.end" = "3"该配置会自动保留最近7天分区,并提前创建未来3天分区。
3. 分桶优化方案
3.1 分桶数量计算
建议每个Tablet数据量控制在1-10GB,计算公式:
分桶数 = 预估分区数据量 / 目标Tablet大小对于10GB数据量,若希望每个Tablet 1GB,则设置10个分桶。
3.2 分桶列选择原则
- 高基数且分布均匀的列(如user_id)
- 频繁作为JOIN/GROUP BY条件的列
- 避免选择存在数据倾斜的列
4. Colocate Join实现
4.1 同分布表配置
- 创建Colocation Group:
CREATE TABLE t1 ( id BIGINT, dt DATE ) DISTRIBUTED BY HASH(id) BUCKETS 8 PROPERTIES ( "colocate_with" = "group1" );- 关联表加入同组:
CREATE TABLE t2 ( id BIGINT, value DOUBLE ) DISTRIBUTED BY HASH(id) BUCKETS 8 PROPERTIES ( "colocate_with" = "group1" );4.2 效果验证
执行JOIN查询时,检查执行计划应显示:
HASH JOIN (COLOCATE)5. 生产环境最佳实践
5.1 时间分区+哈希分桶组合
CREATE TABLE user_behavior ( user_id BIGINT, ts DATETIME, action VARCHAR(32) ) PARTITION BY RANGE(ts)( PARTITION p2023 VALUES LESS THAN ('2024-01-01') ) DISTRIBUTED BY HASH(user_id) BUCKETS 32 PROPERTIES ( "replication_num" = "3", "storage_medium" = "SSD" );5.2 监控与调优
关键监控指标:
- 分区数据均衡率:
max(size)/min(size) < 1.5 - 分桶数据差异:通过
SHOW TABLET FROM查看 - 查询热点:审计日志分析scan行数分布
6. 常见问题处理
6.1 数据倾斜处理
- 识别倾斜分桶:
SELECT tablet_id, count(*) FROM information_schema.tablet_statistics WHERE table_name='t1' GROUP BY tablet_id;- 解决方案:
- 增加分桶数量
- 改用复合分桶键:
DISTRIBUTED BY HASH(user_id, dt) - 启用动态分桶:
BUCKETS AUTO
6.2 分区管理
添加新分区:
ALTER TABLE t1 ADD PARTITION p2024 VALUES LESS THAN ('2025-01-01');合并历史分区:
ALTER TABLE t1 MERGE PARTITIONS p202301,p202302 INTO p2023_q1;7. 性能对比测试
在16节点集群(32C128G)的测试结果:
| 场景 | 查询耗时 | 资源消耗 |
|---|---|---|
| 无分区 | 12.3s | CPU 90% |
| 仅分区 | 4.7s | CPU 45% |
| 分区+分桶 | 1.2s | CPU 30% |
| Colocate Join | 0.8s | 网络IO降低70% |
8. 进阶配置建议
- 冷热数据分层:
PARTITION BY RANGE(ts)( PARTITION p_hot VALUES LESS THAN ('2023-12-01') ("storage_medium"="SSD"), PARTITION p_cold VALUES LESS THAN ('2024-01-01') ("storage_medium"="HDD") )- 分区分桶联动:
-- 每月分区自动分桶 AUTO PARTITION BY RANGE(date_trunc(`dt`, 'month')) DISTRIBUTED BY HASH(`user_id`) BUCKETS 16