ClickStack 中的 TTL
${TABLES_TTL} 会被替换为已配置的数据保留期 (若未更改则为 3 天):
PARTITION BY 子句指定的。该子句可包含基于任意列的 SQL 表达式,其结果决定某一行会被写入哪个分区。这会使数据在逻辑上与磁盘上的各个分区相关联 (通过共同的文件夹名称前缀),从而可以单独查询这些分区。对于上面的示例,默认的 otel_logs schema 使用表达式 toDate(Timestamp) 按天分区。当行被插入到 ClickHouse 时,系统会针对每一行计算该表达式,并将其路由到对应的分区 (如果该分区存在;如果该行是某一天的第一行,则会创建该分区)。有关分区及其其他用途的更多详细信息,请参阅“表分区”。
表的 schema 还包含 TTL toDateTime(Timestamp) + ${TABLES_TTL} 以及设置 ttl_only_drop_parts = 1。前一个子句可确保数据在超过已配置的生存时间 (TTL) 后被删除 (默认 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 中指定。