0
1
1
0
专栏/.../

一文了解 TiDB 的 TTL 功能

 数据源的TiDB学习之路  发表于  2024-06-07

在数据库中,TTL (Time To Live,生存时间) 是一种管理过期数据的功能。通过设置数据的生命周期,可以自动删除过期的数据,从而保证数据库的性能和可用性。TTL 功能通常用于处理时间敏感型数据的应用程序,例如消息队列、会话数据或事件日志。此外,它们还可以用于执行数据保留策略或遵守数据隐私法规,这些法规要求数据在一段时间后必须被删除。TiDB 在 6.5 版本中首次引入 行级 TTL 功能作为实验特性,并于 7.1 版本中正式 GA。本文概括的介绍 TiDB 中行级 TTL 功能。

TTL 适用哪些场景

TTL 设计的目标是不影响在线业务的前提下,帮助用户周期性的及时清理不必要的数据。TTL 比较适用的场景包括:

  1. 定期删除验证码、网址记录
  2. 定期删除不需要的历史订单
  3. 自动删除计算的中间结果

TTL 主要价值

使用TTL可以实现以下功能:

  1. 每行数据将自动被删除。
  2. 即时清除无效数据,节省存储空间,并提高查询性能。
  3. 通过自动删除旧记录,TTL 可以减少数据库所需的手动维护和管理工作量,使得 TiDB 更加易于使用。

如何使用 TTL 功能

TTL 功能作为表级别的一个属性来启用。如果希望表创建时默认有 TTL 能力,可以在建表语句 (CREATE TABLE) 显式指定 TTL 属性;如果想对已存在的表增加 TTL 能力,可以使用修改表语句 (ALTER TABLE) 添加 TTL 属性。

TTL 与时间密切相关,因此设置 TTL 的表中一般都会有一个时间相关的字段,TTL 则设置为与这个时间的一个间隔(INTERVAL) 时间,比如时间字段是create_dt,TTL 设置为 create_dt + INTERVAL 3 month,这表示创建时间超过3个月的数据被标记为过期数据。

下面为一个创建带有 TTL 属性表的示例:

下面为一个通过ALTER TABLE TTL为表增加 TTL 属性的示例:

从以上两个示例的表结构输出中,我们看到除了TTL属性外,还额外显示了两个属性 TTL_ENABLE 和TTL_JOB_INTERVAL。TTL_ENABLE 表示是否启用 TTL 任务,默认值为 ON,如果把 TTL_ENABLE 设置为 OFF,即使表上有 TTL 选项,也不会自动清理过期数据。TTL_JOB_INTERVAL 表示清理过期数据任务的调度周期,默认为 1h,如果想调整过期数据的清理周期,可以使用 ALTER TABLE 来修改此属性。

TTL 工作原理

TTL清理频率:对于设置 TTL 属性的表,TiDB 内部会定期调度后台任务来清理过期的数据,默认的调度周期为 1h,可通过修改表属性 TTL_JOB_INTERVAL 调整,如 ALTER TABLE orders TTL_JOB_INTERVAL = '24h'。

TTL并发设置:对于每个有 TTL 属性的表,TiDB 基于表的 Region 数量将表拆分为最多 64 个子任务,这些子任务被分发到不同的 TiDB 节点执行。默认情况下整个集群中的子任务数最大值与 TiKV 节点数量相同,这可以通过变量 tidb_ddl_running_tasks 进行修改,最大为 256。

禁止TTL任务:禁止 TTL 任务可以基于表级别或全局级别

  1. 单表设置:ALTER TABLE t1 TTL_ENABLE = 'OFF';
  2. 全局设置:SET @@global.tidb_ttl_job_enable = OFF;

删除TTL属性:ALTER TABLE t1 REMOVE TTL;

TTL清理时段:默认情况下,过期数据的清理不受时间段限制,但如果为了避免对业务造成影响也可以设置 TTL 任务 的时间段,比如设置为凌晨01:00~05:00,这可以通过设置系统变更来实现

  1. 开始时间:SET @@global.tidb_ttl_job_schedule_window_start_time = '01:00 +0000';
  2. 结束时间:SET @@global.tidb_ttl_job_schedule_window_end_time = '05:00 +0000';

如何监控 TTL 状态 (可观测性)

TTL 任务是可以被监控的,这有两种方式,一种是通过 Grafana 图形化界面查看,另一种是直接查看相应的元数据表。

Grafana 监控

通过 Grafana-> TiDB -> TTL 可以查看 TTL相关的所有面板。

以下列表描述面板中每个 TTL 相关图表的含义,它们可以帮助分析诊断 TTL 的运行情况,比如通过对比 TTL Insert Rows Per Hour 和 TTL Delete Rows Per Hour 就可以了解 TTL 删除数据是否足够快速以保证表的数据量稳定。

  • TTL QPS By Type:TTL 任务产生的不同类型语句的 QPS 信息。
  • TTL Insert Rows Per Second: 每秒钟向 TTL 表插入的数据行数。
  • TTL Processed Rows Per Second:TTL 任务每秒处理的过期数据的行数。
  • TTL Insert Rows Per Hour: 每小时总共向 TTL 表插入的行数。
  • TTL Delete Rows Per Hour: 每小时总共删除的过期行数。
  • TTL Scan/Delete Query Duration:TTL 的扫描/删除语句的执行时间。
  • TTL Scan/Delete Worker Time By Phase:TTL 内部工作线程的不同阶段所占用的时间。
  • TTL Job Count By Status:当前正在执行的 TTL 任务的数量。
  • TTL Task Count By Status:当前正在执行的 TTL 子任务的数量。

TTL 元数据表

TTL 相应的元数据表及描述如下表格所示:

表名 描述
mysql.tidb_ttl_table_status 包含了所有 TTL 表的上一次执行与正在执行的 TTL 任务的信息。
mysql.tidb_ttl_task 包含了正在执行的 TTL 子任务。单个 TTL 任务会被拆分为多个子任务, 该表中记录了正在执行的这些子任务的信息。
mysql.tidb_ttl_job_history 记录了 TTL 任务的执行历史,TTL 任务的历史记录将被保存 90 天。

参考链接

https://docs.pingcap.com/zh/tidb/stable/time-to-live

0
1
1
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论