使用TTL管理ClickHouse数据生命周期

news/2024/9/15 10:48:18/

ClickHouse中数据随着时间变迁可能需要定期移动、删除或汇总数据。这依赖数据保留需求和历史数据的SLA(服务等级协议),可以对历史数据采用更高的压缩级别节约更多空间。举例,对于超过1个月的数据采用lz4hc压缩算法,则需要DDL语法使用TTL的RECOMPRESS表达式指定压缩算法。本文主要介绍ClickHouse数据库的TTL子句实现大数据管理任务。

自动删除过期数据

有时存储过期数据不再有意义,需要从ClickHouse数据库中删除,通常称为保留策略,在后端任务会自动删除基于TTL条件的数据。

举例,下面event表保留策略需要删除过期一个月的数据:


CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (event, time)
TTL time + INTERVAL 1 MONTH DELETE

增加ttl语句,使用DELETE操作,条件为time + INTERVAL 1 MONTH。即当time列值为过期一个月,对应记录将被删除。

备注:删除记录属于异步后端进程,过期记录可能在一定时间内仍存在。下面插入一组记录,包括过期记录:

INSERT INTO events VALUES('error', now() - interval 2 month, 123), ('error', now(), 123);

插入之后,可以查询到两条记录:

SELECT * FROM events┌─event─┬────────────────time─┬─value─┐
│ error │ 2022-11-24 09:34:44 │   123 │
│ error │ 2023-01-24 09:34:44 │   123 │
└───────┴─────────────────────┴───────┘

过期记录有后端merge任务在定期内执行并删除:

SELECT * FROM events
┌─event─┬────────────────time─┬─value─┐
│ error │ 2023-01-24 09:34:44 │   123 │
└───────┴─────────────────────┴───────┘

管理后端删除

后端删除默认每4小时执行,可以通过表设置选项merge_with_ttl_timeout进行控制:

CREATE TABLE events
...
TTL time + INTERVAL 1 MONTH DELETE
SETTINGS merge_with_ttl_timeout = 1200

不建议周期设置小于300秒,避免I/O负载过大影响性能。一定时间之后过期记录已被删除:

SELECT * FROM events┌─event─┬────────────────time─┬─value─┐
│ error │ 2023-01-24 09:34:44123 │
└───────┴─────────────────────┴───────┘

过滤删除记录

加入仅需要删除特定类型的记录(举例,event值是error),可以给ttl子句添加where条件:

CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (event, time)
TTL time + INTERVAL 1 MONTH DELETE WHERE event = 'error'

现在仅event=‘event’的过期记录才被删除:

INSERT INTO events VALUES('not_error', now() - interval 2 month, 123), ('error', now(), 123)

可以查询确认not_error记录没有被删除:

SELECT * FROM events┌─event─────┬────────────────time─┬─value─┐
│ error     │ 2023-01-24 09:48:05 │   123 │
│ not_error │ 2022-11-24 09:48:05 │   123 │
└───────────┴─────────────────────┴───────┘

多个删除条件

ClickHouse支持配置多个ttl语句,可以更灵活实现数据保留策略。下面示例实现删除1个月的非错误事件,删除6个月的所有错误数据:

CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (event, time)
TTL time + INTERVAL 1 MONTH DELETE WHERE event != 'error',time + INTERVAL 6 MONTH DELETE WHERE event = 'error'

ttl语句可以配置任意多个规则。

移动数据至历史表

可以结合物化视图和ttl语句,解决在主表中删除之前,移动过期数据至另一张表中保留历史记录。
假设想在events表中删除过期数据之前移动error事件去errors_history。首先给物化视图创建目标表,其表结构与events表一致:

CREATE TABLE errors_history (`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (event, time)

注意:这里不能使用CREATE TABLE errors_history AS events语句,注意会拷贝TTL表达式,我们就要修改TTL,然后创建物化视图触发自动抽取数据值error_history表:


CREATE MATERIALIZED VIEW errors_history_mv TO errors_history AS
SELECT * FROM events WHERE event = 'error'

现在当在events表中插入数据时,error事件会自动插入至errors_history表。另外,当ttl过程从events表中删除记录时,数据已经保留至errors_history表。

使用聚集压缩历史数据

有时并不像删除数据,而是为了节约资源需减少数据粒度。举例,下面场景并不删除error事件,但不需要一个月前的每秒的明细信息,仅保留每日汇聚数据量。可以通过在TTL语句中使用GROUP BY ... SET子句实现:

CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (toDate(time), event)
TTL time + INTERVAL 1 MONTH GROUP BY toDate(time), event SET value = SUM(value)

假设插入下面记录:

INSERT INTO events VALUES('error', now() - interval 2 month, 123),('error', now() - interval 2 month, 321);

等后端合并执行之后,可以看到数据已被汇总:

SELECT * FROM events┌─event─┬────────────────time─┬─value─┐
│ error │ 2022-11-24 12:36:23444 │
└───────┴─────────────────────┴───────┘

改变压缩算法

当不能灵活实现删除或聚集数据时,需要更宽松查询服务级别协议的历史数据。我们可以采用针对过期数据采用更高的压缩级别节约空间,举例,让ClickHouse使用LZ4HC更高级别压缩率压缩一个月前的数据,需要使用RECOMPRESS子句:


CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64
)
ENGINE = MergeTree
ORDER BY (toDate(time), event)
TTL time + INTERVAL 1 MONTH RECOMPRESS CODEC(LZ4HC(10))

注意,重新压缩数据可占用更少空间,但需要更多时间去压缩,从而影响插入性能。

列级TTL

ClickHouse也支持列级TTL,控制单列的生命周期。假设表中有debug列存储额外的debug信息,仅需要保留一周,但占用大量空间。可以通过列ttl让其一周重置为缺省值:

CREATE TABLE events
(`event` String,`time` DateTime,`value` UInt64,`debug` String TTL time + INTERVAL 1 WEEK
)
ENGINE = MergeTree
ORDER BY (event, time)

现在插入过期记录,包括debug列值:

INSERT INTO events VALUES('error', now() - interval 1 month, 45, 'a lot of details');-- ttl处理之后查询,可以看到debug已为空字符串SELECT * FROM events┌─event─┬────────────────time─┬─value─┬─debug─┐
│ error │ 2022-12-24 15:13:5445 │       │
└───────┴─────────────────────┴───────┴───────┘

注意,ClickHouse使用ttl列使用缺省值,如果列定义时指定了Default值,则过期列数据会采用Default值。

总结

ClickHouse提供强大数据生命周期管理工具实现自动删除、压缩或在不同存储类型中移动。TTL语句可以在表级别配置压缩和保留策略,也可以配置列级ttl策略。

参考资料:https://dhqgwvxng9vgy.cloudfront.net/blog/using-ttl-to-manage-data-lifecycles-in-clickhouse


http://www.ppmy.cn/news/75253.html

相关文章

MyBatis动态推理参数类型

前言 思考一个问题,前面的#{}和${}的区别中,我们知道了#{},MyBatis底层调用的是preparestatement这种预编译的方式,这种方式sql语句会预先编程 select * from t_user where id ?这种形式,随后调用setInt(),setString…

Postman传递@requestbody标注的List集合的传参遇到的问题

Postman传递requestbody标注的List集合的传参遇到的问题 引子如何测试以及遇到的问题参考文献 引子 我们想测试如下接口 RequestMapping(value "saveMessageRecover", method RequestMethod.POST) ResponseBody public AjaxMessage saveMessageRecover(RequestBod…

Robot Dynamics Lecture Notes学习笔记之关节空间动力学控制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关节空间动力学 关节空间动力学控制关节阻抗调节重力补偿逆动力学控制 关节空间动力学控制 目前的工业机器人几乎完全依赖于关节位置控制的概念。它们建立在PID控制器的基础…

(学习日记)AD学习 #3

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

认识常见中间件-redis(三)-redis缓存更新策略

redis缓存更新策略主要有三种:Cache Aside Pattern、Read/Write Through Pattern、Write Behind Caching Pattern Cache Aside Pattern(旁路缓存) Cache Aside策略是最常用的,应用程序直接与「数据库、缓存」交互,并负责对缓存的…

【JDK】module模块系统

JDK9新特性-module模块系统 在Sources Root下新建module-info.java,内容格式如下所示 module modulename {//模块指令 }modulename具有唯一性一个工程,即使是不同的Sources Root,仅能存在一个module-info.java模块体内可以保留空内容或者模…

QT客户端外包开发的特点

QT是一种跨平台的C应用程序开发框架,主要用于开发图形用户界面(GUI)应用程序。它提供了一套丰富的类库和工具,可以帮助开发者快速构建高质量、可扩展、易于维护的应用程序。今天和大家分享一下QT的主要特点和注意的问题,希望对大家有所帮助。…

分享7款优质免费的Figma“中文插件”

今天我要向你们分享一些 Figma 的“中文插件”,这些插件不仅功能强大,而且免费使用,非常方便,而且是完全中文的页面使用起来非常便捷,可以大大提高设计师的效率和体验。 1、「平面 3D」 插件 首先是平面 3D 插件。该…

ETSI TS-关于SCP80

描述 GPC_UICC Configuration_v2.0.pdf 中: 规范 ts_102.225v12.1.0 Secured packet structure for UICC based applications.pdf spi kic kid编码 7 TCP/IP 的实现 在发送安全数据包之前,发送实体应使用定义的推送机制打开 TCP/IP 连接 在 ETSI TS 102 226 [9] …

【IDEA】DeBug(图文并茂)

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 IDAEA(Interactive Data Anal…

人人可用的开源数据可视化分析工具

大家好,我是互联网架构师! 在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具,我们能够大幅提升数据分析效率、生成更高质量的项目报告,让用…

实时频谱-1.1基本概念

RF信号 RF(射频)是Radio Frequency的缩写,表示可以辐射到空间的电磁频率,频率范围从300KHz~30GHz之间。 中频 IF(intermediate frequency),用来在中频衡量AM或FM调谐器抑制外来干扰的能力,数…

短睡眠 堀大辅 超短眠 人生更丰富

堀大辅是位每天只睡半小时的日本狠人,更多信息自行百度。以下内容,个人收集总结,仅供参考。 堀大辅大胆假设「只要能够减少睡眠的时间,我就能过得更充实」,便与朋友付诸行动,通过纪录观察每天的睡眠时数&a…

网络安全的学习路线

在众多高大上的学习路线指导中,尝试做一股清流,把要讲清楚的都讲清楚,该学些什么,学到哪个程度进入到下一阶段的学习这些才是最重要的。 在学习之前首先要做好学习的系统规划: 1.目前市场需求主流的岗位里&#xff0…

虚幻引擎4利用粒子系统实现物体轨迹描绘

虚幻引擎4利用粒子系统实现物体轨迹描绘 目录 虚幻引擎4利用粒子系统实现物体轨迹描绘前言粒子系统利用粒子系统实现物体轨迹描绘创建粒子系统将粒子系统的产生位置绑定到运动物体上 小结 前言 由于在物体运动时,想要观察其总的运动轨迹,以便对其控制做…

python入门(7)函数系列 2

1. 作用域 在Python中,作用域是指变量在程序中可访问的范围。 1.1作用域种类 Python中有以下几种作用域: (1)全局作用域(Global Scope):全局作用域是在整个程序中都可访问的作用域。在全局作…

Unity Metaverse(七)、基于环信IM SDK实现的好友系统、私聊、群聊

文章目录 🎈 简介🎈 用户管理🎈 好友管理🎈 聊天管理🔸 发送与接收消息🔸 消息处理消息项的对象池管理 🎈 简介 在之前的文章中已经介绍了如何接入环信IM Unity SDK,及基于该SDK实现…

# IO模型

IO模型 非阻塞IO 当程序读取硬件数据时,不管硬件数据是否准备好,read()函数不会阻塞,会继续向下执行 程序会不停监测IO事件是否产生,CPU消耗率高 防止进程阻塞在IO函数上,如果要获得有效数据,需要轮循 …

Mybatis 缓存

JPA 原理 事务 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。 本地事务 紧密依赖于底层资源管理器(例如数据库连接 ),…

【BBQ: A Hand-Built Bias Benchmark for Question Answering 论文精读】

BBQ: A Hand-Built Bias Benchmark for Question Answering 论文精读 InformationAbstract1 Introduction2 Related Work3 The Dataset3.1 Coverage3.2 Template Construction3.3 Vocabulary4 Validation5 Evaluation6 Results7 Discussion8 Conclusion9 Ethical Consideration…