ClickhouseTTL的那些事
TTL简介
ClickHouse原⽣⽀持数据⽣命周期(TTL)管理的功能
TTL即Time To Live,表⽰数据的存活时间。在MergeTree中,可以为某个列字段或者整张表设置TTL。当时间达到时,若列字段级别的TTL 则会删除这⼀列的数据;若表级别的TTL则会删除整张表的数据;若同时设置了列级别的和表级别的TTL则以先到期的为准。
⽆论列级别还是表级别的TTL,都需要依托某个Datetime或者date类型的字段,通过对这个时间字段的INTERVAL操作来表述TTL的过期时间.
⽰例:
TTL time_column
TTL time_column + interval
要定义interval, 需要使⽤时间间隔操作符。
TTL date_time + INTERVAL 1 MONTH
TTL date_time + INTERVAL 15 HOUR
列TTL
当列中的值过期时, ClickHouse会将它们替换成该列数据类型的默认值。如果数据⽚段中列的所有值均已过期,则ClickHouse 会从⽂件系统中的数据⽚段中删除此列。
TTL⼦句不能被⽤于主键字段。
tabletable⽰例:
创建表时指定 TTL
CREATE TABLE example_table
(
d DateTime,
a Int TTL d + INTERVAL 1 MONTH,
b Int TTL d + INTERVAL 1 MONTH,
c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d;
为表中已存在的列字段添加 TTL:
ALTER TABLE example_table
MODIFY COLUMN
c String TTL
d + INTERVAL 1 DAY;
修改列字段的 TTL:
ALTER TABLE example_table
MODIFY COLUMN
c String TTL
d + INTERVAL 1 MONTH;
表TTL
表可以设置⼀个⽤于移除过期⾏的表达式,以及多个⽤于在磁盘或卷上⾃动转移数据⽚段的表达式。当表中的⾏过期时,ClickHouse 会删除所有对应的⾏。对于数据⽚段的转移特性,必须所有的⾏都满⾜转移条件。
TTL 规则的类型紧跟在每个 TTL 表达式后⾯,它会影响满⾜表达式时(到达指定时间时)应当执⾏的操作:
DELETE - 删除过期的⾏(默认操作);
TO DISK 'aaa' - 将数据⽚段移动到磁盘 aaa;
TO VOLUME 'bbb' - 将数据⽚段移动到卷 bbb.
⽰例:
创建时指定 TTL
CREATE TABLE example_table
(
d DateTime,
a Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH [DELETE],
d + INTERVAL 1 WEEK TO VOLUME 'aaa',
d + INTERVAL 2 WEEK TO DISK 'bbb';
修改表的 TTL:
ALTER TABLE example_table
MODIFY TTL d + INTERVAL 1 DAY;
删除数据
ClickHouse 在数据⽚段合并时会删除掉过期的数据。
当ClickHouse发现数据过期时, 它将会执⾏⼀个计划外的合并。要控制这类合并的频率, 可以设置 merge_with_ttl_timeout。如果该值被设置的太低, 它将引发⼤量计划外的合并,这可能会消耗⼤量资源。
如果在合并的过程中执⾏ SELECT 查询, 则可能会得到过期的数据。为了避免这种情况,可以在 SELECT 之前使⽤ OPTIMIZE 查询。
测试分析
⾸先准备⼀个已经做好冷热盘的clickhouse:
创建⼀个test ttl表,数据1分钟过期,超时时间1分钟。
CREATE TABLE test2
(
`d` DateTime,
`a` Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d to volume 'default',
d + toIntervalMinute(1) TO VOLUME 'cold'
SETTINGS storage_policy = 'hot_and_cold';
更改merge_with_ttl_timeout:
ALTER TABLE test MODIFY SETTING merge_with_ttl_timeout = 60;
插⼊数据:
INSERT INTO TABLE test2 VALUES (now(),1),(now()-interval 1 minute,2),(now()-interval 2 minute,3),(now()-interval 3 minute,4);
这4条数据分别会在1分钟后、2分钟后、3分钟后过期。
现在查询test2的数据分布:
因为有1分钟前的数据写⼊,所以有部分数据直接被写在了冷盘。
等ttl到期后,再次查看test2表的数据分布:
可以看到数据全部被转移到了冷盘。
后记
此篇是对之前clickhouse做冷热分区的⼀个补充。希望⼤家⼀起学习,共同进步!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论