文章目录

  • 1.概述
  • 2.环境
  • 3.适用场景
  • 4.列级别的TTL
  • 6. 表级别的TTL
  • 7.TTL的运行原理

1.概述

转载:Clickhouse TTL

在分析场景中,数据的价值随着时间流逝而不断降低,多数业务出于成本考虑只会保留最近几个月的数据,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 + interval 3 DAY

表示数据存活的时间为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 + interval 10 second
,product_type UInt8 TTL create_time + interval 10 second)
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 idOk.0 rows in set. Elapsed: 0.059 sec. Clickhouse> insert into table t_column_ttl values(1,now(),'Huawei',1),(2,now()+interval 1 minute,'Apple',2);INSERT INTO t_column_ttl VALUESOk.2 rows 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-15 12:10:20 │ Huawei       │            1 │
│  2 │ 2020-06-15 12:11:20 │ Apple        │            2 │
└────┴─────────────────────┴──────────────┴──────────────┘2 rows in set. Elapsed: 0.003 sec. Clickhouse> select sleep(10);SELECT sleep(10)↙ Progress: 0.00 rows, 0.00 B (0.00 rows/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 is 3 seconds. Requested: 10. 0 rows in set. Elapsed: 0.111 sec. Clickhouse> select sleep(3);SELECT sleep(3)┌─sleep(3)─┐
│        0 │
└──────────┘1 rows 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-15 12:10:20 │ Huawei       │            1 │
│  2 │ 2020-06-15 12:11:20 │ Apple        │            2 │
└────┴─────────────────────┴──────────────┴──────────────┘2 rows in set. Elapsed: 0.002 sec. Clickhouse> optimize table t_column_ttl final;OPTIMIZE TABLE t_column_ttl FINALOk.0 rows 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-15 12:10:20 │              │            0 │
│  2 │ 2020-06-15 12:11:20 │              │            0 │
└────┴─────────────────────┴──────────────┴──────────────┘2 rows 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 + INTERVAL  2 DAY;

添加字段的TTL:

Clickhouse> alter table t_column_ttl add column product_name String comment '产品名称' ttl create_time + interval 3 month;

– 查看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)   │
└──────────────┴──────────┴──────────────┴────────────────────┴─────────────┴──────────────────┴────────────────────────────────────┘5 rows 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 │
└──────────────┴───────────────────────────┴─────────────┴─────────────┴─────────────────┘5 rows in set. Elapsed: 0.004 sec. 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 │
└──────────────────┴─────────────┴─────────────────┴───────────────────────────┴────────────────────┴─────────────┘5 rows 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 + interval 10 minute,product_type UInt8 )
engine=MergeTree partition by toYYYYMM(create_time) order by create_time
TTL create_time  + INTERVAL 1 MONTH ,create_time + INTERVAL 1 WEEK TO VOLUME 'default',create_time + INTERVAL 2 WEEK TO DISK 'default';

可以看到t_table_ttl 整张表被设置为TTL,当触发TTL清理的时候,哪些满足过期时间的数据行将会被正行删除。

表级别的TTL修改:

Clickhouse> alter table t_table_ttl modify ttl create_time + interval 2 month;

查看信息:

Clickhouse> select database,name,engine,data_paths,metadata_path,metadata_modification_time,partition_key,sorting_key from system.tables where name='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-15 13:01:32 │ toYYYYMM(create_time) │ create_time │
└──────────┴─────────────┴───────────┴─────────────────────────────────────────────────┴────────────────────────────────────────────────────┴────────────────────────────┴───────────────────────┴─────────────┘1 rows 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    │              │                    │          │                  │                                    │
└──────────────┴──────────┴──────────────┴────────────────────┴──────────┴──────────────────┴────────────────────────────────────┘4 rows in set. Elapsed: 0.002 sec.

注意:列级别或者表级别的TTL 目前暂不支持取消操作

7.TTL的运行原理

若一张MergeTree表被设置为TTL 则在写入数据时候会以数据分区为单位,在每个分区目录内生成一个ttl.txt的文件。

写入数据:

Clickhouse> insert into t_table_ttl(id,create_time,product_desc,product_type)values(10,now(),'Huawei',1),(20,now()+ interval 10 minute,'Apple',2);[root@hadoop101 ~]# ls -l /var/lib/clickhouse/data/study/t_table_ttl/202006_1_1_0/
total 60
-rw-r----- 1 clickhouse clickhouse 465 Jun 15 13:14 checksums.txt
-rw-r----- 1 clickhouse clickhouse 115 Jun 15 13:14 columns.txt
-rw-r----- 1 clickhouse clickhouse   1 Jun 15 13:14 count.txt
-rw-r----- 1 clickhouse clickhouse  34 Jun 15 13:14 create_time.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 create_time.mrk2
-rw-r----- 1 clickhouse clickhouse  39 Jun 15 13:14 id.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 id.mrk2
-rw-r----- 1 clickhouse clickhouse   8 Jun 15 13:14 minmax_create_time.idx
-rw-r----- 1 clickhouse clickhouse   4 Jun 15 13:14 partition.dat
-rw-r----- 1 clickhouse clickhouse   8 Jun 15 13:14 primary.idx
-rw-r----- 1 clickhouse clickhouse  39 Jun 15 13:14 product_desc.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 product_desc.mrk2
-rw-r----- 1 clickhouse clickhouse  28 Jun 15 13:14 product_type.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 product_type.mrk2
-rw-r----- 1 clickhouse clickhouse 137 Jun 15 13:14 ttl.txt可以看到在分区目录下有ttl.txt 文件,文件的内容为:
# cat ttl.txt
ttl format version: 1
{"columns":[{"name":"product_desc","min":1592198679,"max":1592199279}],"table":{"min":1597468479,"max":1597469079}}

可以看到MergeTree是通过一串JSON配置保存了TTL的相关信息。
columns 用于保存列级别的TTL信息

  1. tables 用于保存表级别的TTL信息
  2. min和max则保存了当前数据分区内TTL指定的日期字段的最小值和最大值分别与INTERVAL表达式计算后的时间戳。
Clickhouse> select now();SELECT now()┌───────────────now()─┐
│ 2020-06-15 13:28:02 │
└─────────────────────┘1 rows in set. Elapsed: 0.004 sec.

列的:

Clickhouse> select toDateTime('1592198679') ttl_min,toDateTime('1592199279') ttl_max,ttl_min - min(create_time) expire_min,ttl_max - max(create_time) expire_max from t_table_ttl;SELECT toDateTime('1592198679') AS ttl_min, toDateTime('1592199279') AS ttl_max, ttl_min - min(create_time) AS expire_min, ttl_max - max(create_time) AS expire_max
FROM t_table_ttl┌─────────────ttl_min─┬─────────────ttl_max─┬─expire_min─┬─expire_max─┐
│ 2020-06-15 13:24:39 │ 2020-06-15 13:34:39 │        600 │        600 │
└─────────────────────┴─────────────────────┴────────────┴────────────┘1 rows in set. Elapsed: 0.026 sec. 

表值:

Clickhouse> select toDateTime('1597468479') ttl_min,toDateTime('1597469079') ttl_max,ttl_min - min(create_time) expire_min,ttl_max - max(create_time) expire_max from t_table_ttl;SELECT toDateTime('1597468479') AS ttl_min, toDateTime('1597469079') AS ttl_max, ttl_min - min(create_time) AS expire_min, ttl_max - max(create_time) AS expire_max
FROM t_table_ttl┌─────────────ttl_min─┬─────────────ttl_max─┬─expire_min─┬─expire_max─┐
│ 2020-08-15 13:14:39 │ 2020-08-15 13:24:39 │    5270400 │    5270400 │
└─────────────────────┴─────────────────────┴────────────┴────────────┘1 rows in set. Elapsed: 0.006 sec. 

可以看ttl.txt 记录的极值区间恰好等于当前数据分区内create_time的最大值和最小值,和TTL的表达式的预期相符合。

通过TTL的信息记录方式 可以推断大体的处理逻辑:

  1. MergeTree 是以分区目录为单位,通过ttl.txt 记录过期时间,并以此作为判断标准。
  2. 每当写入一批数据时候,都会基于interval 表达式的计算结果为这个分区生成ttl.txt 文件
  3. 只有在MergeTree合并分区才会触发TTL过期数据的逻辑
  4. 在删除分区的时候,选择使用了贪婪算法,算法规则即尽可能找到会最早过期,同时时间最早的分区。
  5. 若一个分区内某一列因为TTL到期则全部删除,在合并之后生成的新分区目录中将不会包含这个列字段的数据文件(.bin 和.mrk)

注意

  1. TTL默认的合并频率有MergeTree的参数merge_with_ttl_timeout 控制,默认周期未86400秒。
    它专门维护一个专有的TTL任务队列。有别于MergeTree的常规合并任务,若这个值设置的过小则可能会带来性能损耗。
    此设置意味着仅在一个分区上或发生后台合并时,每24小时执行一次TTL删除。因此,在最坏的情况下,ClickHouse现在最多每24小时删除一个与TTL delete表达式匹配的分区。
    此行为可能并不理想,因此,如果您希望TTL删除表达式更快地执行删除操作,则可以修改表的merge_with_ttl_timeout设置
alter table t_table_ttl  MODIFY SETTING merge_with_ttl_timeout = 3600;

设置为一个小时。

  1. 除了触发TTL合并外,optimize 命令可以强制触发合并。
触发一个分区合并:
optimize table t;
触发所有分区合并:
optimize table t final;
  1. 目前没有删除ttl的声明方法,但是提供了全局控制TTL合并任务的启动和关停方法:
system stop/start TTL MERGE

相关参数:

以下是参数及其当前默认值的列表:

background_move_pool_size:8
background_move_processing_pool_thread_sleep_seconds:10
background_move_processing_pool_thread_sleep_seconds_random_part:1.0
background_move_processing_pool_thread_sleep_seconds_if_nothing_to_do:0.1
background_move_processing_pool_task_sleep_seconds_when_no_work_min:10
background_move_processing_pool_task_sleep_seconds_when_no_work_max:600
background_move_processing_pool_task_sleep_seconds_when_no_work_multiplier:1.1
background_move_processing_pool_task_sleep_seconds_when_no_work_random_part:1.0

【Clickhouse】Clickhouse TTL 数据的存活时间相关推荐

  1. Clickhouse 在唯品会数据产品的实践

    ‍ 本文作者:邓刚,陈晨,周飞强,冯广远,严旭东 ‍ 一.唯品会离线数仓模式 1.1 数据产品使用数仓数据的方式 公司的数据产品包括数据运营平台,自助分析,魔方(对接供应商),运营中台等.数据产品使用 ...

  2. clickhouse数据库删除数据的五种方式

    文章目录 前言 一.通过删除表分区的方式 二.执行delete方式 三.执行truncate方式 四.设置表数据生命周期 五.删除数据文件目录 总结 前言 clickhouse数据库清理数据的方式很多 ...

  3. clickhouse 同步 mysql数据

    前言 通过前面的篇章,我们了解到clickhouse是一款性能很高的OLAP数据存储.数据分析型数据库引擎,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告,基于此,在 ...

  4. 【ClickHouse】查看数据库容量和表大小的方法(system.parts各种操作方法)

    文章目录 1.概述 本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 1.概述 转载:[ClickHouse]查看数据库容量和表大小的方法(system. ...

  5. ClickHouse数据库和数据表

    文章目录 ClickHouse数据库和数据表 大小写敏感 数据库 数据库操作 ClickHouse数据库引擎 数据存储目录 数据表 数据表操作 创建数据表 复制表结构 复制表结构和数据 ClickHo ...

  6. 【ClickHouse SQL 极简教程】ClickHouse SQL之数据定义语言 DDL

    1.1. ClickHouse SQL之数据定义语言 DDL  本节介绍 ClickHouse 中进行数据库.表结构的定义和管理. 1.1.1. 概述 在SQL中,数据定义语言( DDL ) 用来创建 ...

  7. 2023-02-10 clickhouse导入tpch数据-记录

    摘要: clickhouse导入tpch数据-记录 生成TPCH数据: 2022-07-06 使用tpch大数据量压测mysql_大数据怎么压测_帝尊悟世的博客-CSDN博客 clickhouse导入 ...

  8. Clickhouse批量插入数据时报错:Too many partitions for single INSERT block

    我们在使用clickhouse时,有时候会在建表时指定分片字段,分片字段如果指定的比较合适会将同类的数据放在同一个文件内,提高批量查询的效率,但是如果分片字段执行的不合适,会导致插入式报错. 批量插入 ...

  9. 设置cookie存活时间_Django之cookie、session、token

    客户端会话技术:cookie 服务端会话技术:session 自定义会话技术:token 一.cookie cookie本身由服务器端生成,通过Response将cookie写到浏览器上,下一次再次访 ...

最新文章

  1. 《精解Windows8》——2.6 Windows应用商店
  2. 【bzoj5100】[POI2018]Plan metra 构造
  3. APUE读书笔记 之 进程关系
  4. poj2464扫描线好题,树状数组解法
  5. 【北航oj】(线段树取模运算)
  6. extern 详解(内有extern C 讲解)
  7. tableau两个不同的图合并_【书稿摘要】Tableau地图函数(下)
  8. linux搭建博客-day 7安装Nginx
  9. 【Python 24】52周存钱挑战4.0(函数)
  10. 91 个常见的 Laravel 面试题和答案
  11. The server encountered an unexpected condition that prevented it from fulfilling the request
  12. 奥比中光深度摄像头_奥比中光展示智能深度3D摄像头技术解决方案
  13. 30分钟java桌球小游戏_30分钟完成桌球小游戏项目
  14. 阿里云 ECS 服务器上如何搭建 Hadoop 集群详细步骤图解
  15. 解决Maven打包报错:Failed to clean project: Failed to delete
  16. 保护小程序,防止反编译:打造不怕反编译的小程序
  17. Codevs 1697 ⑨要写信
  18. RocketMQ 消费者Rebalance 解析——图解、源码级解析
  19. CCF CSP 压缩编码
  20. 真正解决vbox不能为虚拟电脑打开一个新任务的解决方法

热门文章

  1. 消息称《绝地求生》开发商Krafton将启动IPO 腾讯是大股东
  2. 消息称AirPods 3搭载U1芯片 耳机柄变小
  3. 外媒称三星已对苹果折叠屏订单进行采样
  4. 华为MatePad Pro 5G平板正式发布:售价5299元起!
  5. 新iPhone终于要去掉刘海了,但这个操作好骚啊!
  6. 苹果或于2020年开售iPhone SE2
  7. 百度宣布搜索公司战略转型:原总裁向海龙离职 沈抖晋升为高级副总裁
  8. 新能源补贴退坡 广汽新能源、比亚迪不涨价 蔚来最狠!
  9. 再见!“一代神机”iPhone 6或将于今年5月停产 iPhone 7/8降至3500档
  10. FTP server的使用【原创】