ClickStack 中的生存时间 (TTL)
PARTITION BY 子句指定的。该子句可以包含基于任意列的 SQL 表达式,其结果将决定某一行会被写入哪个分区。这样一来,磁盘上的数据就会通过共同的文件夹名称前缀与各个分区建立逻辑关联,从而可以单独查询某个分区。以上述示例为例,默认的 otel_logs schema 使用表达式 toDate(Timestamp). 按天分区。当行被插入 ClickHouse 时,系统会针对每一行计算该表达式,并将其路由到相应的分区;如果该分区尚不存在 (即这是某一天的第一行数据) ,则会创建该分区。有关分区及其其他用途的更多信息,请参阅”表分区”。
表的 schema 还包含 TTL TimestampTime + toIntervalDay(3) 以及设置 ttl_only_drop_parts = 1。前一个子句可确保数据在超过 3 天后被删除。设置 ttl_only_drop_parts = 1 会强制仅在整个数据分区片段中的数据都已过期时才删除该数据分区片段 (而不是尝试部分删除行) 。由于分区可确保不同日期的数据永远不会被“merged”,因此可以高效地删除数据。
默认情况下,生存时间 (TTL) 已过期的数据会在 ClickHouse 合并数据分区片段 时被移除。当 ClickHouse 检测到数据已过期时,它会执行一次计划外合并。
生存时间 (TTL) 调度如上所述,生存时间 (TTL) 不会立即生效,而是按计划执行。MergeTree 表设置
merge_with_ttl_timeout 用于设置再次执行带删除生存时间 (TTL) 的合并前的最小延迟秒数。默认值为 14400 秒 (4 小时) 。但这只是最小延迟;生存时间 (TTL) 合并实际触发前,可能还需要更长时间。如果该值过低,系统会执行大量计划外合并,可能消耗大量资源。可以使用命令 ALTER TABLE my_table MATERIALIZE TTL 强制触发一次生存时间 (TTL) 过期处理。修改生存时间 (TTL)
- 修改表的 schema (推荐) 。这需要连接到 ClickHouse 实例,例如使用 clickhouse-client 或 Cloud SQL 控制台。例如,可以使用以下 DDL 修改
otel_logs表的生存时间 (TTL):
- 修改 OTel collector。ClickStack OpenTelemetry collector 会在 ClickHouse 中自动创建不存在的表。这是通过 ClickHouse exporter 实现的;该组件提供了一个
ttl参数,用于控制默认的生存时间 (TTL) 表达式,例如
列级生存时间 (TTL)
Body 列,以防后续新增了尚未在写入时提取的动态元数据,例如新的 Kubernetes 标签。经过一段时间 (例如 1 个月) 后,可能就会明显看出,这些额外元数据并没有实际用处——因此继续保留 Body 列的价值也就有限了。
下面我们展示如何在 30 天后删除 Body 列。
指定列级生存时间 (TTL) 需要用户自行定义 schema,无法在 OTel collector 中指定。