三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Doris数据过期策略:分区TTL与自动清理实践

Doris数据过期策略:分区TTL与自动清理实践

1. Doris数据过期策略概述

在数据仓库和OLAP系统中,历史数据管理一直是个棘手的问题。Doris作为一款开源的MPP分析型数据库,其数据过期策略能有效解决这个问题。我最近在生产环境部署了一套基于时间分区的自动清理机制,实测下来效果相当不错。

Doris的数据过期策略本质上是通过分区级别的TTL(Time To Live)机制实现的。与传统的定时删除任务不同,这种方案直接集成在存储引擎内部,具有原子性和一致性保证。举个例子,我们有个日增量200GB的用户行为表,通过合理配置分区过期策略,系统每天凌晨会自动清理3个月前的数据,整个过程对前端查询完全透明。

2. 核心实现原理

2.1 分区与TTL机制

Doris的数据过期策略依赖于分区表设计。假设我们创建如下时间分区表:

CREATE TABLE user_events ( event_time DATETIME, user_id BIGINT, event_type VARCHAR(32) ) PARTITION BY RANGE(event_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" );

关键点在于通过PARTITION BY RANGE按时间划分数据。每个分区相当于独立的存储单元,系统会检查分区的时间范围是否超出设定的TTL阈值。

2.2 动态分区与自动清理

更实用的方案是结合动态分区:

ALTER TABLE user_events SET ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "MONTH", "dynamic_partition.start" = "-3", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.buckets" = "32" );

这段配置实现了:

  • 自动创建未来3个月的分区(end=3)
  • 保留最近3个月数据(start=-3)
  • 每月自动清理超过3个月的分区

3. 生产环境配置要点

3.1 参数调优建议

PROPERTIES中建议添加这些参数:

"storage_cooldown_time" = "7 days" -- HDD冷存延迟时间 "disable_auto_compaction" = "false" -- 保持自动压缩 "enable_single_replica_compaction" = "true" -- 单副本压缩

重要提示:冷热数据分离时,建议冷数据分区设置更长TTL。比如热数据保留1个月,温数据3个月,冷数据1年。

3.2 资源隔离策略

大规模清理时可能影响查询性能,建议:

  1. 通过SET exec_mem_limit=8589934592;限制清理任务内存
  2. 使用ALTER SYSTEM SET tablet_sched_max_scheduling_tablets=5000;控制并发度
  3. 在业务低峰期执行清理(通过crontab定时)

4. 常见问题排查

4.1 清理任务卡住

检查步骤:

  1. 查看SHOW PROC '/cluster_balance/pending_tablets'
  2. 检查BE节点磁盘空间df -h
  3. 观察SHOW BACKENDS\G中的LastStreamLoadTime

典型解决方案:

-- 临时增加任务超时时间 SET query_timeout=3600; ALTER TABLE user_events SET ("storage_policy" = "default");

4.2 数据误删除恢复

如果误删分区,可以通过:

  1. 从备份恢复(如果有快照)
  2. 通过RECOVER命令恢复分区:
RECOVER PARTITION p202301 FROM user_events;

5. 进阶使用技巧

5.1 多级存储策略

结合冷热数据分离:

ALTER TABLE user_events SET ( "storage_policy" = "hot_data_policy", "storage_resource" = "ssd_resource" );

5.2 审计与监控

建议配置:

  1. 审计日志audit_log_dir
  2. Prometheus监控enable_metric_calculator=true
  3. 自定义告警规则:
- alert: PartitionExpireFailed expr: rate(doris_fe_partition_expire_failed_total[5m]) > 0 for: 10m

6. 性能优化实践

6.1 分区粒度选择

根据数据量选择合理分区粒度:

  • 日分区:单分区<50GB
  • 月分区:50GB~1TB
  • 年分区:>1TB

实测案例:某电商日志表从日分区改为周分区后,元数据管理开销降低70%。

6.2 并行清理优化

通过调整这些参数提升清理速度:

ALTER SYSTEM SET tablet_sched_max_scheduling_tablets=10000; ALTER SYSTEM SET tablet_sched_balance_load_disk_safe_threshold=0.8;

7. 与其他系统的对比

特性DorisHBaseClickHouse
清理粒度分区级Region级分区级
原子性支持支持不支持
对查询影响
恢复能力中等

8. 实际应用案例

某金融风控系统配置示例:

-- 主表保留3个月 ALTER TABLE risk_events SET ( "dynamic_partition.start" = "-3", "storage_medium" = "SSD" ); -- 冷备份表保留2年 ALTER TABLE risk_events_cold SET ( "dynamic_partition.start" = "-24", "storage_medium" = "HDD", "storage_cooldown_time" = "30 days" );

这套配置实现了:

  • 热数据SSD存储加速查询
  • 温数据自动降级到HDD
  • 冷数据保留更长时间但成本更低

9. 注意事项与踩坑记录

  1. 时区问题:动态分区默认使用系统时区,建议显式设置time_zone = "+08:00"

  2. 小文件问题:过期分区如果包含大量小文件,建议先执行手动压缩:

ALTER TABLE user_events COMPACT PARTITION p202301;
  1. 内存控制:大规模表清理时监控BE节点内存,避免OOM:
SET exec_mem_limit=4294967296; -- 4GB
  1. 元数据锁:清理期间避免执行DDL操作,可能引发死锁

10. 未来改进方向

  1. 基于访问频率的智能降级(热->温->冷)
  2. 云原生存储分层(对象存储集成)
  3. 更细粒度的列级别TTL

这套方案在我们生产环境运行半年,累计自动清理PB级历史数据,节省存储成本60%以上。最关键的是完全无需人工干预,真正实现了"set and forget"的数据管理理念。

← 返回列表