1.概述

转载:ClickHouse表引擎 MergeTree 数据生命周期

  • TTL(Time To Live)表示数据的存活时间,在 Merge 中可以为某个字段或者整个表设置TTL。

  • 如果设置列级别的 TTL,那么到期时会删除这一列的数据

  • 如果设置表级别的 TTL,那么到期时会删除整个表的数据

  • 如果同时设置了列级别和表级别的 TTL,那么会以先到期的为主。

  • 无论是列级别还是表级别的 TTL 都要依靠 DateTime 或 Date 类型的字段,通过对这个字段的 Interval 操作,来表述 TTL 的过期时间。

  • INTERVAL 的完整操作包括:SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 和 YEAR

-- 设置数据存活时间是 create_time 的三天后
TTL create_time + INTERVAL 3 DAY-- 设置数据存活时间是 create_time 的三个月后
TTL create_time + INTERVAL 3 MONTH

2.列级别 TTL

  • 设置列级别的 TTL,需要在建表时设置列的 TTL 表达式

  • 主键不能被设置 TTL

-- 创建表并设置 TTL 字段
-- create_time 是事件类型的字段,
-- code1 和 code2 均被设置了 TTL,
-- 存活时间为create_time的基础上向后10 秒和 15 秒
CREATE TABLE merge_column_ttl
(`id` String,`create_time` DateTime,`code1` String TTL create_time + INTERVAL 10 SECOND,`code2` UInt8 TTL create_time + INTERVAL 15 SECOND
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id;-- 查看表结构describe merge_column_ttl;┌─name────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─────────────────────┐
│ id          │ String   │              │                    │         │                  │                                    │
│ create_time │ DateTime │              │                    │         │                  │                                    │
│ code1       │ String   │              │                    │         │                  │ create_time + toIntervalSecond(10) │
│ code2       │ Int32    │              │                    │         │                  │ create_time + toIntervalSecond(15) │
└─────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────────────────────────┘-- 写入测试数据
insert into table merge_column_ttl values
('A01',now(),'A01-code1','100'),
('A02',now() + INTERVAL 3 MINUTE,'A02-code1','99');-- 当差不多过十秒后查看数据
select * from merge_column_ttl;┌─id──┬─────────create_time─┬─code1─────┬─code2─┐
│ A01 │ 2021-06-23 15:50:17 │           │   100 │
│ A02 │ 2021-06-23 15:53:17 │ A02-code1 │    99 │
└─────┴─────────────────────┴───────────┴───────┘-- 强制触发 TTL 清理
optimize table merge_column_ttl final;
-- 查看测试数据
select * from merge_column_ttl;┌─id──┬─────────create_time─┬─code1─────┬─code2─┐
│ A01 │ 2021-06-23 15:50:17 │           │     0 │
│ A02 │ 2021-06-23 15:53:17 │ A02-code1 │    99 │
└─────┴─────────────────────┴───────────┴───────┘
-- 可以看到测试数据被还原成了 每个字段类型的默认值

修改字段 TTL

alter table merge_column_ttl modify column code1 String TTL create_time + INTERVAL 10 MINUTE;-- 查看表结构
describe merge_column_ttl;┌─name────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─────────────────────┐
│ id          │ String   │              │                    │         │                  │                                    │
│ create_time │ DateTime │              │                    │         │                  │                                    │
│ code1       │ String   │              │                    │         │                  │ create_time + toIntervalMinute(10) │
│ code2       │ Int32    │              │                    │         │                  │ create_time + toIntervalSecond(15) │
└─────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────────────────────────┘

3.表级别 TTL

想要为整张表设置 TTL,需要在建表时设置表的 TTL 表达式

-- 建表设置表的 TTL
CREATE TABLE merge_table_ttl
(`id` String,`create_time` DateTime,`code1` String TTL create_time + INTERVAL 10 SECOND,`code2` UInt8
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id
TTL create_time + INTERVAL 15 SECOND;-- 写入测试数据insert into table merge_table_ttl values
('A01',now(),'A01-code1','100'),
('A02',now() + INTERVAL 3 MINUTE,'A02-code1','99');-- 查看数据,这是还没有过期数据
select * from merge_table_ttl;┌─id──┬─────────create_time─┬─code1─────┬─code2─┐
│ A01 │ 2021-06-23 16:26:12 │ A01-code1 │   100 │
│ A02 │ 2021-06-23 16:29:12 │ A02-code1 │    99 │
└─────┴─────────────────────┴───────────┴───────┘-- 强制清理 TTL 数据
optimize table merge_table_ttl final;-- 查看数据,这时 code1 有一行数据过期,被还原成默认值
select * from merge_table_ttl;┌─id──┬─────────create_time─┬─code1─────┬─code2─┐
│ A01 │ 2021-06-23 16:26:12 │           │   100 │
│ A02 │ 2021-06-23 16:29:12 │ A02-code1 │    99 │
└─────┴─────────────────────┴───────────┴───────┘-- 强制清理 TTL 数据
optimize table merge_table_ttl final;-- 查看数据,这时 A01 这行数据过期已经被删掉
select * from merge_table_ttl;┌─id──┬─────────create_time─┬─code1─────┬─code2─┐
│ A02 │ 2021-06-23 16:29:12 │ A02-code1 │    99 │
└─────┴─────────────────────┴───────────┴───────┘

修改表级别的 TTL

alter table merge_table_ttl modify ttl create_time + INTERVAL 15 MINUTE;

4. TTL 运行原理

如果一张表被设置了 TTL,在写入数据时,会以数据分区为单位,在每个分区目录中生成一个 ttl.txt 的文件,如 merge_table_ttl 表即被设置了列级别的 TTL 也被设置了表级别的 TTL,那么每个分区目录都会生成 ttl.txt 文

cd /var/lib/clickhouse/data/db_merge/merge_table_ttl/202106_1_1_3[root@node3 202106_1_1_3]# cat ttl.txt
ttl format version: 1
{"columns":[{"name":"code1","min":1624436962,"max":1624436962}],"table":{"min":1624436967,"max":1624436967}}# 将上面的 json 格式化 并加上描述
# MergeTree 通过 json 结构的数据保存 ttl 的相关信息:
{"columns": [ # 用于保存 列级别的 TTL 信息{"name": "code1","min": 1624436962,"max": 1624436962}],"table": {# 用于保存 表级别的 TTL 信息"min": 1624436967,"max": 1624436967}
}

min 与 max 保存了当前分区内,TTL 指定日期字段的最大值,最小值分别与 INTERVAL 表达式计算后的时间戳。

如果将table 属性中的min 和 max 时间戳格式化,并分别与 create_time 的最大,最小取值作对比。

SELECTtoDateTime('1624436967') AS ttl_min,toDateTime('1624436967') AS ttl_max,ttl_min - MIN(create_time) AS expire_min,ttl_max - MAX(create_time) AS expire_max
FROM merge_table_ttlQuery id: ad5dc6af-1f8c-41a2-829a-802ad702cfbe┌─────────────ttl_min─┬─────────────ttl_max─┬─expire_min─┬─expire_max─┐
│ 2021-06-23 16:29:27 │ 2021-06-23 16:29:27 │         15 │         15 │
└─────────────────────┴─────────────────────┴────────────┴────────────┘

ttl.txt记录的 min,max 值恰好对应 create_time + INTERVAL 15 SECOND 的值。

MergeTree 处理 TTL 的大致逻辑如下:

  1. MergeTree 以分区目录为单位,通过 ttl.txt 文件记录过期时间,并将其作为后续判断依据
  2. 每当写入一批数据时,都会基于 INTERVAL 表达式的计算结果为这个分区生成 ttl.txt文件
  3. 只有在 MergeTree 分区合并时,才会触发删除过期数据的逻辑。
  4. 在删除数据时,会使用贪婪算法,算法规则是尽可能找到会最早过期的,同时年纪又最老的分区(合并次数最多,MaxBlockNum最大)
  5. 如果一个分区的某个字段因为 TTL 到期,导致数据被全部删除,那么合并分区时在生成新分区将不会创建该字段的数据文件(.mrk、.bin)

MergeTree 处理 TTL 的其他事项:

  1. TTL 的默认合并频率由MergeTree 的 merge_with_ttl_timeout 参数控制,默认 86400 秒,即 1 天,它维护一个专门的 TTL 队列。如果这个时间设置的过小会带来性能损耗。
  2. 除了被动触发 TTL,还可以使用optimize 命令强制触发合并。
--  触发一个分区的合并
optimize table table_name-- 触发所有分区的合并
optimize table table_name final

Clickhouse 提供了控制全局 TTL 任务合并的方法,但是不能按照数据表停起


SYSTEM STOP/START MERGES

【clickhouse】ClickHouse表引擎 MergeTree 数据生命周期相关推荐

  1. Clickhouse—MergeTree 数据生命周期

    Clickhouse-MergeTree 数据生命周期 今天我们介绍一下MergeTree的数据的生命周期,其实我们知道数据的生命周期管理其实是数据治理的一个环节,我们在数仓中管理数据的生命周期主要是 ...

  2. [1183]Clickhouse数据表数据分区partition数据生命周期操作

    文章目录 表操作 创建数据库 创建表 删除表 清空表 删除表某个分区 重命名或移动数据表 表字段column操作 添加字段 删除字段 修改字段 修改字段名称 数据分区partition的基本操作 查询 ...

  3. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引

    1.概述 转载:ClickHouse表引擎 MergeTree 索引与数据存储方式 2.一级索引 MergeTree 主键使用 primary key 定义,定义主键后,会将数据依据 index_gr ...

  4. 3、ClickHouse表引擎-MergeTree引擎

    ClickHouse系列文章 1.ClickHouse介绍 2.clickhouse安装与简单验证(centos) 3.ClickHouse表引擎-MergeTree引擎 4.clickhouse的L ...

  5. ClickHouse的表引擎介绍(三)

    文章目录 引入表引擎的概念以及特点 一.TinyLog 二.Memory 三.MergeTree 四.ReplacingMergeTree 五.SummingMergeTree 六.Integrati ...

  6. 【clickhouse】Clickhouse的MySQL引擎同步数据不准确 Decimal

    文章目录 1.概述 2. 场景2 2.1 概述 1.概述 我想从MySQL同步数据到Clickhouse,但是发现Clickhouse的MySQL引擎同步数据不准确,精度丢失而且还是不对的.(很多数据 ...

  7. clickhouse CollapsingMergeTree表引擎

    CollapsingMergeTree表引擎 CollapsingMergeTree就是一种通过以增代删的思路,支持行级数据修改和删除的表引擎.它通过定义一个sign标记位字段,记录数据行的状态.如果 ...

  8. Apache Falcon简介-Hadoop数据生命周期管理框架

    Apache Falcon是一个开源的hadoop数据生命周期管理框架, 它提供了数据源 (Feed) 的管理服务,如生命周期管理,备份,存档到云等,通过Web UI可以很容易地配置这些预定义的策略, ...

  9. 数据生命周期 - 分区

    SQL Server 技术文章 技术评论员:Grant Dickinson.Dave Wickert.Len Wyatt 和 Stuart Ozer 适用于:SQL Server 2005 本页内容 ...

最新文章

  1. java之定时器任务Timer用法
  2. 在网页中插入百度地图
  3. 2019计算机视觉论文精选速递(2019/1/23-2018/1/28)
  4. wine运行exe程序只出现了一个黑色长方形
  5. Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
  6. 12c oracle 激活_Oracle 12C 安装教程
  7. @Autowired作用在普通方法上
  8. 如何用xml 描述目录结构_如何用英语描述人物外表
  9. 关于多线程的一点补充
  10. qq视频转码失败怎么办_qq影音为什么不能转码 进行视频转码方法
  11. ul1977标准_UL1977标准连接器UL认证测试内容
  12. 高性能mysql读书笔记三性能查询优化
  13. java设计模式2,开闭原则
  14. 多旋翼无人机ROSC++开发例程(四):基于Prometheus开源项目与Casadi开源优化求解器的模型预测控制简单应用例程
  15. Cannot find ./catalina.sh The file is absent or does not hav
  16. 实现不同的导航条,看直播app开发怎么做
  17. Autofac简单介绍
  18. 南京印象之出租车司机
  19. 如何在REST API中使用查阅项的值作为过滤条件
  20. JavaScript 实现动物识别专家系统交互演示

热门文章

  1. OPPO宣布与哈苏达成影像战略合作
  2. 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
  3. 大手笔!EDG夺冠TCL奖励300万,还送全系AI家电一套
  4. 华谊兄弟:实际控制人王忠军、王忠磊合计减持1.44%公司股份
  5. 小米11真机现身:稳了!
  6. 瑞幸咖啡恢复交易 股价大跌35.76%
  7. 武汉将投放5亿元消费券,4月19日微信率先开抢
  8. 余承东:华为自研的麒麟A1芯片已经应用在了多款可穿戴产品中
  9. 疫情相关电信诈骗涉案金额超3.51亿元,谨防这四类骗局!
  10. 腕上“小型手机”!小米手表万事俱备 坐等发布