磁盘回收TTL_物联网平台_边缘计算网关

💡 提示

执行DELETE语句后, 只是将数据在表中被标记为"已删除"并不能释放磁盘。磁盘释放需要执行VACUUM操作。

前置条件

1、开启TTL功能

2、配置TTL时间(平台配置、租户配置)

磁盘回收执行者

平台CORE服务

CORE服务启动后,根据执行频率延迟执行。

磁盘回收原理

1、租户存在。

2、租户配置存在。

3、从租户配置获取配置的TTL信息。

4、从数据库获取过期数据。

5.1、执行数据库命令删除数据

5.2、执行数据库命令删除表中过期(平台配置)的分区释放磁盘。

public long dropPartitionsBefore(String table, long ts, long partitionDurationMs) {
        List<Long> partitions = fetchPartitions(table);
        long lastDroppedPartitionEndTime = -1;
        for (Long partitionStartTime : partitions) {
            long partitionEndTime = getPartitionEndTime(partitionStartTime, partitionDurationMs);
            if (partitionEndTime < ts) {
                log.info("[{}] Detaching expired partition: [{}-{}]", table, partitionStartTime, partitionEndTime);
                boolean success = detachAndDropPartition(table, partitionStartTime);
                if (success) {
                    log.info("[{}] Detached expired partition: {}", table, partitionStartTime);
                    lastDroppedPartitionEndTime = Math.max(partitionEndTime, lastDroppedPartitionEndTime);
                }
            } else {
                log.debug("[{}] Skipping valid partition: {}", table, partitionStartTime);
            }
        }
        return lastDroppedPartitionEndTime;
    }
private boolean detachAndDropPartition(String table, long partitionTs) {
        Map<Long, SqlPartition> cachedPartitions = tablesPartitions.get(table);
        if (cachedPartitions != null) cachedPartitions.remove(partitionTs);

        String tablePartition = table + "_" + partitionTs;
        String detachPsqlStmtStr = "ALTER TABLE " + table + " DETACH PARTITION " + tablePartition;

        // hotfix of ERROR: partition "integration_debug_event_1678323600000" already pending detach in partitioned table "public.integration_debug_event"
        // https://github.com/thingsboard/thingsboard/issues/8271
        // if (getCurrentServerVersion() >= PSQL_VERSION_14) {
        //    detachPsqlStmtStr += " CONCURRENTLY";
        // }

        String dropStmtStr = "DROP TABLE " + tablePartition;
        try {
            getJdbcTemplate().execute(detachPsqlStmtStr);
            getJdbcTemplate().execute(dropStmtStr);
            return true;
        } catch (DataAccessException e) {
            log.error("[{}] Error occurred trying to detach and drop the partition {} ", table, partitionTs, e);
        }
        return false;
    }

回收内容

AuditLogEntity(audit_log)

EdgeEventEntity(edge_event)

事件(error_event、lc_event、stats_event、rule_node_debug_event、rule_chain_debug_event、cf_debug_event)

NotificationRequestEntity(notification_request)

遥测数据(ts_kv)

时序数据库TimescaleDb

磁盘回收原理

1、基于TTL时间为timescaledb创建磁盘回收策略,。

2、timescale的回收策略定期释放磁盘。

回收内容

遥测数据(ts_kv)

分布式数据库Cassandra

磁盘回收原理

1、数据入库时设置数据TTL时间。

2、cassandra定期释放磁盘。

回收内容

遥测数据(ts_kv)

本文通过 YUQUE WORDPRESS 同步自语雀
云腾五洲-AI助理