数据保留周期

更新时间:
复制 MD 格式

Fluss 提供日志保留、KV 保留和分区保留三种数据保留机制,可组合配置,控制数据在表中的保留时长。

保留机制概览

机制

过期对象

主要配置

日志保留(Log Retention)

日志表的数据日志、主键表的 Changelog

table.log.ttl

KV 保留(KV Retention)

主键表 KV 存储中的单行数据

table.kv.ttl

分区保留(Partition Retention)

日志表或主键表中完整的时间分区

table.auto-partition.*

三种机制可叠加使用。例如,主键表可以在保留当前数据行的同时,仅保留一天的 Changelog。

说明

过期清理为异步执行,TTL 不是数据删除或磁盘空间回收的精确期限。

日志保留

表日志 TTL

通过 table.log.ttl 控制日志的保留时长。默认值为 7 天,设置为 0ms 表示禁用基于该 TTL 的过期清理。

  • 对于日志表,该配置控制表数据本身的保留。

  • 对于主键表,该配置控制消费者可读的 Changelog 历史。当前 KV 数据行由 KV 保留机制控制,见下文。

本地日志 TTL

开启远程存储(默认开启)后,本地与远程存储分工不同:

  • 本地存储是热层,保存最新数据,服务低延迟的尾部读取。默认使用 Apache Arrow 日志格式,支持列裁剪,流式消费仅读取所需列。

  • 远程存储是冷层,在配置的日志保留期内保持较旧日志可读,即使本地副本已删除。它支持历史数据回放,以及超出本地窗口的消费追赶。远程日志读取通常有更充裕的网络带宽,不影响集群的在线读写流量。

本地保留时长的建议估算方式:尾部消费者的预期最大滞后,加上重启与反压后的追赶时间,再留出一定余量。远程保留时长则根据消费者需要回放多久之前的数据来设置。由此实现热工作集留在本地、远程存储承载更长历史。

相关配置项如下:

配置项

默认值

说明

table.log.ttl

7 d

控制远程日志的保留时长。

table.log.local-ttl

继承 table.log.ttl

控制本地副本基于 TTL 的清理。设置为 0ms 表示禁用该清理策略。

table.log.tiered.local-segments

2

基于数量的清理策略所保留的最近本地日志段数量,必须大于 0。

两个 TTL 均为正值时,table.log.local-ttl 不得大于 table.log.ttl。本地副本上传至远程后,到达本地 TTL 或日志段数量上限任一条件即可能被删除。将本地 TTL 设置为 0ms 时,基于数量的清理策略仍然生效。

image

例如:消费者滞后通常不超过 30 分钟,重启与追赶预留 1 小时,则 table.log.local-ttl 可设为 '2 h' 作为起点;需要 7 天回放历史时,table.log.ttl 设为 '7 d'。同时应按峰值写入速率与各分桶日志段滚动频率,估算覆盖该 2 小时热窗口所需的 table.log.tiered.local-segments。默认值 2 并不保证本地保留 2 小时的数据:基于数量的策略可能早于本地 TTL 删除本地副本。读取超出本地窗口的数据时,将访问远程存储。

上述三个表级配置均支持 ALTER TABLE ... SET 与 ALTER TABLE ... RESET 修改。

活跃段滚动

低写入量的表中,活跃日志端即使已过期,若没有新数据写入也不会被关闭,无法上传与清理。开启服务端配置 log.retention.roll-active-segment.enabled 后,已过期的活跃日志可在无新数据写入时正常上传与清理。该配置默认关闭,支持集群动态更新,过期时间遵循上文描述的有效本地日志 TTL。

KV 保留

主键表支持行级 TTL,在创建表时配置:

配置项

默认值

说明

table.kv.ttl

未设置时禁用

使单行 KV 数据过期。配置时必须不小于 1 毫秒。

table.kv.ttl.time-column

未设置,使用处理时间

使用指定列的事件时间判断行过期,需与 table.kv.ttl 搭配使用。

image

示例:以下表按事件时间使数据行 7 天后过期,同时仅保留 1 天 Changelog。

CREATE TABLE pk_table
(
    id BIGINT,
    event_time BIGINT,
    name STRING,
    PRIMARY KEY (id) NOT ENFORCED
) WITH (
    'bucket.num' = '4',
    'table.kv.ttl' = '7 d',
    'table.kv.ttl.time-column' = 'event_time',
    'table.log.ttl' = '1 d'
);

使用规则与限制:

  • 创建行级 TTL 表前,须将集群所有节点升级至 Fluss 0.9-ali-7.1 及以上;存在该类表后,不支持降级至该版本以下。

  • 两个配置项仅支持建表时设置,不支持后续修改或重置。

  • 过期判断默认基于处理时间。设置 table.kv.ttl.time-column 后改用事件时间:该列类型须为 BIGINT(Unix 毫秒时间戳)、TIMESTAMP 或 TIMESTAMP_LTZ,其中 TIMESTAMP 按 TabletServer 系统时区解释,各服务器时区须一致;该列值为 NULL 的行不过期。

  • 过期不等于立即不可读。清理异步执行,到期仅表示可清理;清理完成前仍可能读到过期行,延迟无上限保证,不适用于要求到期立即不可读的场景。

  • 清理不写 Changelog。$changelog、$binlog 虚拟表及 Changelog 消费者观察不到清理事件;清理后再次写入相同主键视为插入。

  • 远程快照保留策略独立于行级 TTL,由 kv.snapshot.num-retained 控制。

分区保留

数据需要按完整时间分区过期时,使用自动分区功能,日志表与主键表均适用。设置 table.auto-partition.enabled = 'true'(默认 false)开启,详细操作请参见《数据分区》。

配置项

默认值

说明

table.auto-partition.time-unit

DAY

分区创建与过期的日历时间单位。

table.auto-partition.num-retention

7

保留当前时间单位之前的历史分区数量,更早的分区过期删除。

table.auto-partition.num-precreate

2

预创建的分区数量(含当前分区),不会延长保留时长。

table.auto-partition.time-zone

系统时区

日历边界的时区。

image

例如:时间单位为 DAY 且 num-retention = '3' 时,11 月 11 日当天保留 11 月 8 日至 10 日三个历史分区及当前分区 11 月 11 日;默认预创建数量还会创建 11 月 12 日。向更早的分区写入新数据不会延长该分区的保留时长。

  • 日志 TTL 与 KV TTL 会在分区内部使数据过期;即使日志或 KV 的 TTL 长于分区保留时长,也不会阻止分区整体过期。

  • 保留数量与预创建数量支持 ALTER TABLE ... SET 与 ALTER TABLE ... RESET 修改。

  • 对于湖流一体表,Fluss 日志或分区过期后,已分层存储到数据湖中的数据仍可通过 Union Read 访问。