ClickHouse TTL新特性详解

Author: Sundy Li, 2019-11-06.

ClickHouse TTL新特性详解

李本旺@bigo (sundy-li)

为什么需要TTL

运维痛点 之前我们如何删除过期数据

我太难了

TTL功能介绍

示例

CREATE TABLE default.ttl ( `d` DateTime, `b` UInt32 DEFAULT 3 TTL d + interval 1 day ) ENGINE = MergeTree PARTITION BY toYYYYMMDD(d) ORDER BY d TTL d + toIntervalDay(30) SETTINGS index_granularity = 8192; insert into ttl select today() - 5, 2 from system.numbers limit 10 ; select sleep(3) format Null; select count(), sum(b) from ttl; alter table ttl modify ttl d + interval 4 day; select count(), sum(b) from ttl; insert into ttl select today() - 3 , 2; select count(), sum(b) from ttl; optimize table ttl final; select count(), sum(b) from ttl;

原理详解

TTL 表达式

CREATE TABLE ttl_table ( `d` DateTime, `a` Int ) ENGINE = MergeTree PARTITION BY toDayOfMonth(d) ORDER BY tuple() TTL d + toIntervalDay(1)

解析器,转换成AST表达式

ParserKeyword s_ttl{"TTL"}; ASTPtr ttl_expression; if (s_ttl.ignore(pos, expected)) { if (!expression_parser.parse(pos, ttl_expression, expected)) return false; }

TTL Info 存储

每个part存储一个 ttl.txt文件

相关代码: MergeTreeDataPartTTLInfo.h, MergeTreeDataWriter::writeTempPart

TTL Merge 流程

Partition 内部 Part 的合并
参考代码:
StorageMergeTree.h

  • Merge存在多次写放大
  • 后台线程轮询Merge Parts
  • Merge的选择[Partition,Parts] 策略由很多参数控制
  • 参考 SimpleMergeSelector.cpp

TTL数据删除逻辑

TTL Info的合并

  • Part被读取后,TTL Info也会应用最新的TTL表达式进行更新
  • 多个Part的TTL Info进行交集合并

TTL Merge的相关思考

回顾 MergeSelector的思路 Q: 上述的 TTL 在这种场景下会存在哪些局限?

Select 的完善

TTLMergeSelector 逻辑

  • 每个 merge_with_ttl_timeout 周期内有一次机会进行select
  • 根据ttl_info排序, 贪心策略选择一个Partition下的Parts

Optimize 逻辑

  • 强制调用一次 force merge
  • Parts 合并成一个 大的Partition

TTL 原理总结

TTL 使用注意事项

TTL 高级用法

用起来吧!
ClickHouse TTL 是个好功能

节省了更多业余时间陪家人(女朋友)

感谢各位聆听

欢迎一切技术交流,微信:543950155

BIGO招聘: 大数据,推荐算法(C++/java/python ...)

Base: 广州,北京,新加坡