You need to enable JavaScript to run this app.
导航
TTL
最近更新时间:2024.09.20 18:02:26首次发布时间:2024.09.18 17:43:04

TTL(Time To Live)是指数据的生存时间,在 ByteHouse 企业版中 TTL 可以按照删除级别和行为进行分类。

基本概念

按删除级别分类的 TTL 包括 Partition-level TTL 和 Row-level TTL:

  • Partition-level TTL:要求 TTL 涉及的列必须是 Partition 字段的一部分,同一 partition 内的数据在 TTL 过期时可执行统一的动作(删除或移动到其他磁盘)。
  • Row-level TTL:TTL 字段可由任意列组成,过期的数据在 Merge 的时候从磁盘删除或 parts 在其包含的所有数据都过期时被移动到其他磁盘。

按行为分类的 TTL 包括 Delete TTL 和 Move TTL:

  • Delete TTL:会在 TTL 过期时将数据删除。
  • Move TTL:会在 TTL 过期时将数据移动到其他磁盘或者磁盘组(Volume)。

另外,对于修改 TTL 也有一定的使用限制:

  • 对于 Partition-level TTL,在 ByteHouse 企业版 2.4 以上版本,对于 Delete TTL 和 Move TTL 都支持了实时计算,所以当修改 TTL 后,旧数据也可通过 TTL 实现自动删除或移动到其他磁盘。
  • 对于Row-level TTL,因为其 TTL 信息存储在磁盘,修改TTL后需执行Materialize TTL修改旧parts的TTL信息,旧parts才可按新的TTL生效。

差异对比

Partition-level TTL 和 Row-level TTL都可以实现数据的删除或移动,但其在数据的删除和移动上的行为会有所差别。另外,当用户通过Alter命令修改TTL后,两种TTL的表现也有所差别,具体参考下表。

Partition-level TTL

Row-level TTL

Delete TTL

  • Partition相同的part拥有相同的过期时间,故数据可以以Partition为单位进行删除。
  • 当Partition-level TTL到期时,会通过生成DROP RANGEpart将该partition下的所有parts标记删除。
  • 过期数据对查询不可见。
  • 每行数据拥有自己的过期时间,每个part中可能会有部分数据过期。
  • 过期数据在 Merge 时从磁盘上删除。
  • 查询时不会对parts中未及时删除的数据进行过滤,过期数据可被查询。

Move TTL

  • 分批将TTL过期的partition下的数据移动到目标磁盘。
  • Merge时更新TTL涉及行的最小过期时间(min)和最大过期时间(max),记录到part目录下ttl.txt
  • part中所有数据过期后(current_time >= max),将该part其移动到目标磁盘。

修改TTL

  • 对于已存在parts可实时生效。
  • 对新写入parts可实时生效。
  • 对已经存在parts需通过执行Materialize TTL,提交Mutation修改已存在parts的ttl.txt文件,使新TTL对旧parts生效。
  • 对新写入parts可实时生效。

表引擎支持情况

MergeTree Family 表引擎对于以上 TTL支持情况如下表。

Partition-level TTL
(Delete)

Partition-level TTL
(Move)

Row-level TTL
(Delete)

Row-level TTL
(Move)

备注

MergeTree

按 Row-level TTL 生效

ByteHouse 企业版 2.4.1.970版本及以上

MergeTree表的Partition-level TTL(Delete)会按Row-level TTL处理

HaMergeTree

ByteHouse 企业版 2.4.1.970版本及以上

推荐使用partition-level TTL

HaUniqueMergeTree

ByteHouse 企业版 2.4.1.970版本及以上

推荐使用partition-level TTL

使用示例

基本语法

TTL 常常与配冷热分层移动因子策略一同配置,详情可参考冷热分层存储
基本示例如下:

-- 建表时增加TTL
CREATE TABLE example_table on cluster xxxx
(
    d Date,
    a Int
)
ENGINE = HaMergeTree(...)
PARTITION BY d
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE,
    d + INTERVAL 2 WEEK TO DISK 'S3'
SETTINGS index_granularity = 8192, storage_policy = 's3_cold';

-- 修改 TTL 策略
ALTER TABLE table_name on cluster cluster_name 
MODIFY TTL toDate(create_date) + toIntervalDay(30) TO DISK 's3';

若如此配置,多级 TTL 和移动因子策略会同时生效。即数据满足了 TTL 的移动条件,或者冷热因子的移动条件后,都会发起热数据向冷数据的移动。

Partition-level TTL 与 Row-level TTL

以下为Partition-level TTL 和 Row-level TTL 使用示例。

Case 1:
PARTITION BY p_date

TTL p_date + interval 10 day -- Partition-level TTL
TTL toDate(x) + interval 10 day -- Row-level TTL: x 不是partition by的字段

Case 2:
PARTITION BY toDate(event_time), toHour(event_time)

TTL toDate(event_time) + interval 10 day -- Partition-level TTL, toDate(event_time)是partition by中的一个字段
TTL event_time + interval 10 day -- Row-level TTL, event_time不是partition by中的一个字段

Case 3:
PARTITION BY event_time
 
TTL toDate(event_time) + INTERVAL 1 MONTH -- Partition-level TTL, event_time是partition by字段

Delete TTL 与 Move TTL

以下为Delete TTL 和 Move TTL 使用示例。

TTL p_date + interval 10 day -- Delete TTL, p_date超过10天的数据将会被删除
TTL p_date + interval 10 day TO Disk 'disk_s3' -- Move TTL, p_date超过10天的数据会移动到disk_s3
TTL event_time + interval 10 hour -- Delete TTL
TTL event_time + interval 10 hour TO Volume 'volume_s3' -- Move TTL

需要注意的是,一张表只能指定一个Delete TTL,可以指定多个Move TTL;一张表的TTL可由0~1个Delete TTL 和0~n个Move TTL组成。

TTL p_date + interval 10 day -- Yes, 仅包含1个Delete TTL
TTL p_date + interval 10 day, event_time + interval 10 hour -- Error: 最多只能有一个Delete TTL
TTL p_date + interval 10 day TO disk 'disk_s3', event_time + interval 10 hour TO Volume 'volume_s3' -- Yes, 包含0个Delete TTL和2个Move TTL
TTL p_date + interval 20 day, p_date + interval 10 day TO disk 'disk_s3', event_time + interval 10 hour TO Volume 'volume_s3' -- Yes, 包含1个Delete TTL和2个Move TTL