【Clickhouse】ClickhouseTTL数据的存活时间
⽂章⽬录
1.概述
转载:
在分析场景中,数据的价值随着时间流逝⽽不断降低,多数业务出于成本考虑只会保留最近⼏个⽉的数据,ClickHouse通过TTL提供了数据⽣命周期管理的能⼒。
ClickHouse⽀持⼏种不同粒度的TTL:
1. 列级别TTL:当⼀列中的部分数据过期后,会被替换成默认值;当全列数据都过期后,会删除该列。
2. ⾏级别TTL:当某⼀⾏过期后,会直接删除该⾏。
3. 分区级别TTL:当分区过期后,会直接删除该分区。
伤感非主流网名
2.环境
运⾏环境:
centos 7.6
Clickhouse>select version();
SELECT version()
┌─version()─┐
│20.4.4.18│
└───────────┘
TTL即Time To Live 表⽰数据的存活时间。在MergeTree中,可以为某个列字段或者整张表设置TTL。当时间达到时,若列字段级别的TTL 则会删除这⼀列的数据;若表级别的TTL则会删除整张表的数据;若同时设置了列级别的和表级别的TTL则以先到期的为准。
⽆论列级别还是表级别的TTL,都需要依托某个Datetime或者date类型的字段,通过对这个时间字段的INTERVAL操作来表述TTL的过期时间:
⽰例:
TTL time_column +interval3DAY
表⽰数据存活的时间为time_column 时间的3天之后。
林峰与潘霜霜INTERVAL⽀持的操作:second,minute,hour,day,week,month,quarter,year。
3.适⽤场景
数仓建设需要考虑数据的⽣命周期问题,数据的⽣命周期包括数据最初的写⼊,存储,处理,查询,归档和销毁⼏个基本的阶段。
实际中数仓数据量的成倍增长,不但产⽣了巨⼤容量的存储,同时也造成管理的困难,更换存储⽅式和存储迁移对项⽬来讲都是需要考虑成本和风险的。clickhouse这样的⼀个设计,可以有效处理解决数据有效的存储周期和销毁的问题。ck的出现对数据存储的数仓的业务选型⼜添加⼀种选择。
概⾔之:
1. 定期删除过期数据
2. 定期移动过期数据进⾏归档
适⽤对象:
1.列
2.表
3.分区表
4.物化视图的列
4.列级别的TTL
若要设置列级别的TTL,则需要在定义表字段的时候,为他们声明TTL表达式,主键字段不能被声明TTL。
Clickhouse>create table t_column_ttl(id UInt64 comment'Primary key'
,create_time Datetime
托福和雅思哪个难,product_desc String  TTL create_time +interval10second
,product_type UInt8 TTL create_time +interval10second)
沉香如屑男主是余墨还是唐周engine=MergeTree partition by toYYYYMM(create_time)order by id;
CREATE TABLE t_column_ttl
(
`id` UInt64 COMMENT'Primary key',
`create_time`Datetime,
`product_desc` String TTL create_time + toIntervalSecond(10),
`product_type` UInt8 TTL create_time + toIntervalSecond(10)
)
ENGINE= MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id
Ok.
0rows in set. Elapsed: 0.059 sec.
Clickhouse>insert into table t_column_ttl values(1,now(),'Huawei',1),(2,now()+interval1minute,'Apple',2);
INSERT INTO t_column_ttl VALUES
Ok.
2rows in set. Elapsed: 0.018 sec.
Clickhouse>select*from t_column_ttl;
SELECT*
FROM t_column_ttl
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│1│2020-06-1512:10:20│ Huawei      │1│
│2│2020-06-1512:11:20│ Apple        │2│
└────┴─────────────────────┴──────────────┴──────────────┘
2rows in set. Elapsed: 0.003 sec.
Clickhouse>select sleep(10);
SELECT sleep(10)
↙ Progress: 0.00rows,0.00 B (0.00rows/s.,0.00 B/s.) Received exception from server (version 20.4.4):
Code: 160. DB::Exception: Received from localhost:9000. DB::Exception: The maximum sleep time is3 seconds. Requested: 10.
0rows in set. Elapsed: 0.111 sec.
Clickhouse>select sleep(3);
SELECT sleep(3)
┌─sleep(3)─┐
│0│
└──────────┘
1rows in set. Elapsed: 3.003 sec.
Clickhouse>select*from t_column_ttl;
SELECT*
FROM t_column_ttl
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│1│2020-06-1512:10:20│ Huawei      │1│
│2│2020-06-1512:11:20│ Apple        │2│
└────┴─────────────────────┴──────────────┴──────────────┘
2rows in set. Elapsed: 0.002 sec.
Clickhouse>optimize table t_column_ttl final;
OPTIMIZE TABLE t_column_ttl FINAL
Ok.
0rows in set. Elapsed: 0.004 sec.
Clickhouse>select*from t_column_ttl;
SELECT*
FROM t_column_ttl
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│1│2020-06-1512:10:20││0│
│2│2020-06-1512:11:20││0│
└────┴─────────────────────┴──────────────┴──────────────┘
2rows in set. Elapsed: 0.003 sec.
执⾏optimize命令会强制触发TTL清理,若再次查询可以看到满⾜TTL条件之后,定义了TTL操作的字段列会被还原为数据类型的默认值。
修改列字段的TTL或者修改已有字段的TTL::
Clickhouse>alter table t_column_ttl MODIFY COLUMN product_desc String  TTL create_time +INTERVAL2DAY;
添加字段的TTL:
Clickhouse>alter table t_column_ttl add column product_name String comment'产品名称' ttl create_time +interval3month;
– 查看TTL的信息:
Clickhouse>desc t_column_ttl;
DESCRIBE TABLE t_column_ttl
┌─name─────────┬─type─────┬─default_type─┬─default_expression─┬─comment─────┬─codec_expression─┬─ttl_expression─────────────────────┐
│ id          │ UInt64  │││Primary key│││
│ create_time  │DateTime││││││
韩彩英怀孕│ product_desc │ String  │││││ create_time + toIntervalDay(2)│
│ product_type │ UInt8    │││││ create_time + toIntervalSecond(10)│
│ product_name │ String  │││产品名称││ create_time + toIntervalMonth(3)│
└──────────────┴──────────┴──────────────┴────────────────────┴─────────────┴──────────────────┴────────────────────────────────────┘
5rows in set. Elapsed: 0.003 sec.
6. 表级别的TTL
可以在MergeTree的表参数中增加TTL表达式 为整张表设置TTL。
– 设置之前需要查配置的 disk和volume:
Clickhouse>select*from system.disks
:
-];
SELECT*
FROM system.disks
┌─name─────────┬─path──────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┐
│default│/var/lib/clickhouse/│7788174336│16095640576│1024│
│ disk_archive │/data/clickhouse_archive/│213757952│10724835328│0│
│ disk_cold    │/data/clickhouse_cold/│213757952│10724835328│0│
│ disk_hot1    │/opt/clickhouse_hot1/│16288342016│26830438400│0│
│ disk_hot2    │/opt/clickhouse_hot2/│16288342016│26830438400│0│
└──────────────┴───────────────────────────┴─────────────┴─────────────┴─────────────────┘
5rows in set. Elapsed: 0.004 sec.
1尺9是多少厘米
Clickhouse>select*from system.storage_policies;
SELECT*
FROM system.storage_policies
┌─policy_name──────┬─volume_name─┬─volume_priority─┬─disks─────────────────────┬─max_data_part_size─┬─move_factor─┐
│ JBOD_default    │ disk_group  │1│['disk_hot1','disk_hot2']│0│0.1│
│default│default│1│['default']│0│0│
│ default_hot_cold │ hot        │1│['disk_hot1','disk_hot2']│1048576│0.2│
│ default_hot_cold │ cold        │2│['disk_cold']│10737418240│0.2│
│ default_hot_cold │ archive    │3│['disk_archive']│0│0.2│
└──────────────────┴─────────────┴─────────────────┴───────────────────────────┴────────────────────┴─────────────┘
5rows in set. Elapsed: 0.006 sec.
表的定义:
create table t_table_ttl(id UInt64 comment'主键',create_time Datetime comment'创建时间',product_desc String  comment'产品描述' TTL create_time +int erval10minute,product_type UInt8 )
engine=MergeTree partition by toYYYYMM(create_time)order by create_time
TTL create_time  +INTERVAL1MONTH,
create_time +INTERVAL1 WEEK TO VOLUME 'default',
create_time +INTERVAL2 WEEK TO DISK'default';
可以看到t_table_ttl 整张表被设置为TTL,当触发TTL清理的时候,哪些满⾜过期时间的数据⾏将会被正⾏删除。
表级别的TTL修改:
Clickhouse>alter table t_table_ttl modify ttl create_time +interval2month;
查看信息:
Clickhouse>select database,name,engine,data_paths,metadata_path,metadata_modification_time,partition_key,sorting_key from system.tables where na me='t_table_ttl';
SELECT
database,
name,
engine,
data_paths,
metadata_path,
metadata_modification_time,
partition_key,
sorting_key
FROM system.tables
WHERE name ='t_table_ttl'
┌─database─┬─name────────┬─engine────┬─data_paths──────────────────────────────────────┬─metadata_path──────────────────────────────────────┬─metadata_modification_time─┬─partition_key─────────┬─sorting_key─┐
│ study    │ t_table_ttl │ MergeTree │['/var/lib/clickhouse/data/study/t_table_ttl/']│/var/lib/clickhouse/metadata/study/t_table_ttl.sql│2020-06-1513:0 1:32│ toYYYYMM(create_time)│ create_time │
└──────────┴─────────────┴───────────┴─────────────────────────────────────────────────┴────────────────────────────────────────────────────┴────────────────────────────┴───────────────────────┴─────────────┘
1rows in set. Elapsed: 0.010 sec.
查看表的结构:
Clickhouse>desc t_table_ttl;
DESCRIBE TABLE t_table_ttl
┌─name─────────┬─type─────┬─default_type─┬─default_expression─┬─comment──┬─codec_expression─┬─ttl_expression─────────────────────┐│ id          │ UInt64  │││主键│││
│ create_time  │DateTime│││创建时间│││
│ product_desc │ String  │││产品描述││ create_time + toIntervalMinute(10)│
│ product_type │ UInt8    ││││││
└──────────────┴──────────┴──────────────┴────────────────────┴──────────┴──────────────────┴────────────────────────────────────┘
4rows in set. Elapsed: 0.002 sec.
注意:列级别或者表级别的TTL ⽬前暂不⽀持取消操作。
7.TTL的运⾏原理