使用谷歌云 Cloud Spanner 的 TTL 自动清理不需要的数据

前不久,Google Cloud 对外宣布 Cloud Spanner 的实时 TTL 已正式开放使用,TTL 作为企业管理功能套件的重要组成,允许数据库管理员自定义策略、定期从 Spanner 表中删除临时或不需要的数据,而清除不必要的数据不仅有助于降低存储和备份成本,还可以提高数据库查询性能。

TTL 是数据库定期清理活动的理想之选,主要目的在于取代一次性清理脚本,减少操作开销以及手工错误的机会。可以在后台持续运行,定期按一致的时间戳分批处理过期数据。目前,已经对 Spanner 客户开放使用,且无需支付额外的费用。

举例:实时路由规划

该虚拟的交付调度示例目的在于帮助大家理解 TTL 是如何降低成本及复杂性。当用户请求交付时,应用会计算多个路由选项,然后根据优化算法选择最佳选项,例如,将包沿同一路由分组在一起。

应用程序这方面的简化 Spanner 模式可能如下所示:

    CREATE TABLE CalculatedRoutes (

      PartyId INT64,

      RouteId INT64,

      CreatedAt TIMESTAMP NOT NULL,

      RouteStatus STRING(10) NOT NULL

    ) PRIMARY KEY (PartyId, RouteId);

 

    CREATE TABLE RouteSteps (

      PartyId INT64,

      RouteId INT64,

      Step INT64,

      Waypoint STRING(MAX)

    ) PRIMARY KEY (PartyId, RouteId, Step),

    INTERLEAVE IN PARENT CalculatedRoutes ON DELETE CASCADE;

CalculatedRoutes 持有给定交付的可能选项,RouteSteps 表捕获给定选项的相关转式路由。每个计算的路由有许多步骤。RouteSteps 表和相关的 CalculatedRoutes 交织在一起 。表交互是一对多相关数据的有用性能优化,这些数据经常一起访问,例如,显示转动方向或计算优化算法中路由的总分。


匹配算法的质量和速度是整体用户体验的关键。在实时优化过程中,高度可用性和一致性至关重要。Spanner 为这些类型的读写交互式工作负载提供扩缩性,可用性和全局一致性高达 99.999%。不过,一旦路线得到确认,就不再需要替代方案了。对于此次虚构的应用程序在处理的大量交付,这些短期数据是很难处理的。Spanner 为应用程序提供了通过 TTL 设置行级删除策略的能力,以更好地管理数据。


TTL 完全托管的后台清理

Spanner 支持在 SQL 中 DELETE 或分区删除数据,这对于在需要精确控制事务边界或希望通过投入高优先级资源来减少处理时间的情况下,非常有用。TTL 通过完全托管的后台程序来补充这一点,从而最大限度的减少对整个系统的影响,无需处理手动分区、批处理、重试。

该功能的重要之处还体现在以下几个方面:

简单:行删除策略是声明性的。只需告诉 Spanner 什么时候需要删除,而不是如何进行删除。我们可以在 schema 中对 TTL 逻辑进行集中定义,这样便于与其所管理的表进行统一管理,并且无需通过复杂的应用程序代码或外部脚本进行推理来理解关键的清理逻辑。

可扩展性:TTL 可随数据库进行同步扩展。Spanner 可以无缝地将过期的行数据及被删除的数据分发到实例中的所有节点。随着数据库的扩展,TTL 会进行动态调整而无需任何干预。

可预测性:TTL 目的在于最大限度地减小对其他数据库工作负载的影响,其清理流程在系统低优先级地后台工作,与自定义查询相比,它可以更有效地随时间和可用实例资源扩展工作,以实现最小开销。  

可观察性:TTL 已经集成到 Cloud Monitoring 中,与堆栈的其余部分一起对进度和警告进行端到端的洞察,为开发人员无需构建、维护额外的管道。

配置行删除策略

要想看到  TTL 的实际运行状况,我们需要配置 Spanner,让它可以在9天之后自动删除示例中的临时路由。

第一步是向架构定义中的 calculatedroues 表添加行删除策略。与其他模式更改一样,设置或更改行删除策略是一项特权操作。

    ALTER TABLE CalculatedRoutes 

      ADD ROW DELETION POLICY (OLDER_THAN(CreatedAt, INTERVAL 9 DAY));

当表中的行符合自动删除的条件时,行删除策略会告诉 Spanner 。这基于时间戳和间隔,例如,对于给定的行,“创建时间加上9天”。行删除策略的时间戳列可以使用 Spanner 的内置提交时间戳,使用TrueTime 进行精确跟踪。

因为我们在上面交错的子 RouteSteps 表上指定了 ON DELETE CASCADE,所以这些相关的行将在与父路由相同的事务中被自动删除。这确保了给定路由及其步骤的参照完整性,即使路由在多个事务中被批量删除。

更新架构后,TTL 将自动调整其后台扫描以适应所有可用策略,并在下一个周期中获取任何更改。

生命周期时间

在行删除策略下,当某一行符合删除条件时,不会立即不可查询。后台进程(或“清理器”)会每天检查符合条件的行,然后批量执行实际的删除操作,会首先删除看尽数据存储内部位置的行以提高效率。此外,还会自动调整批大小,并对瞬态错误进行重试。例如,如果相关索引或交错的子节点会导致事务超出突变限制,则它会减少批大小。即使重试,行通常也会在3天内被删除,之后便会无法查询。

  通常可以在7天内,从已经删除的行中回收某个单独的进程。


过期逻辑

要实现这一点,我们可以使用生成的列来捕获业务逻辑,然后将行删除策略附加到该列上。这种生成的列和行删除策略的组合提供了一种灵活的方式来启用更高级的逻辑,而不会创建过于复杂或存在潜在冲突的规则。

    ALTER TABLE CalculatedRoutes

      ADD COLUMN LegalHoldUntil TIMESTAMP;

 

    ALTER TABLE CalculatedRoutes

      ADD COLUMN ExpiredDate TIMESTAMP AS (

        GREATEST(

    COALESCE(LegalHoldUntil, CreatedAt), 

    TIMESTAMP_ADD(CreatedAt, INTERVAL 9 DAY)))

      STORED;

 

    ALTER TABLE CalculatedRoutes 

      REPLACE ROW DELETION POLICY (OLDER_THAN(ExpiredDate, INTERVAL 0 DAY));


如上,我们已将行删除策略替换为附加到生成列的新策略。与前面一样,生成的列必须是一个TIMESTAMP。ExpiredDate 使用 SQL 语句计算合法持有日期或创建日期加9天(原始策略)的较大值。Spanner 确保生成的列始终与它所依赖的列保持一致。

行删除策略中的 INTERVAL 0 DAY 表示在指定的时间戳上,行可以立即被删除。我们计算的策略将条件区间逻辑移动到生成的列定义中。


监测进展情况

当我们配置了旧路由的自动清理,还可以使用 Cloud Monitoring 和内置系统表来观察行清理的进度,以确保满足数据处理要求,同时对问题进行识别。

指标 deleted_rows_count 跟踪 TTL 清理的行的吞吐量。当行在全天的不同时间过期,以及扫描器在 Spanner 实例中分布在各节点上的并行删除拆分或单个数据切片的删除时,吞吐量自然会波动。


TTL 吞吐量会随着行的过期而波动并进行清理


行清理会在不同时间运行,以最大限度地减少 Spanner 实例上的总负载。

processed_watermark_age 指标跟踪自最后一次成功扫描符合条件行以来的时间。如果 TTL 后台清理拥有扫描合格数据所需的资源,那么我们将在一到两天内看到常规锯齿模式,如下图所示。符合条件的行通常在资源充足的情况下在三天内删除。


如果 TTL 过程比预期的要长,或者遇到无法重述的错误,可以配置提醒。


在 Cloud Monitoring 中创建关于 TTL 水印周期的通知

管理员还可以查询内置系统表,以便更好地了解 TTL 清理的状态。例如,可以列举清理失败的所有表,并检查无法自动删除的旧行的时间戳,例如由于事务约束。


如果 TTL 水印周期超过三天的警报阈值(259,200,000 毫秒 = 3 小时× 60 分钟× 60 秒× 1000 毫秒)

    SELECT TABLE_NAME, UNDELETABLE_ROWS, MIN_UNDELETABLE_TIMESTAMP 

    FROM SPANNER_SYS.ROW_DELETION_POLICIES 

    WHERE UNDELETABLE_ROWS > 0;


TTL  提供了一种自动方式,可定期删除 Spanner 数据库中旧的、未需要的数据。后台清理可降低存储和备份成本,并可提高需要扫描大量数据的查询性能,它还有助于实现数据保留策略的自动化。

管理员使用时间戳列和时间间隔(例如,最后更新加 90 天)将行删除策略附加到表中。在后台,Spanner 定期检查符合条件的行,并分批删除,包括交错子表。与管理员必须手动编写的自定义应用程序代码或脚本不同,TTL 可自动处理并行和重试,确保进度,并且对其他工作负载的影响最小,而无需复杂的分区或错误处理逻辑。


WebEye 是中国大陆地区首家获得 Google Cloud MSP 资质的合作伙伴。点击了解:企业上云服务

WebEye 为全球企业提供⼀站式数字媒体营销解决方案、增长效率工具平台、云服务、安全合规、游戏发行服务。我们汇集全球优质的移动营销资源,用大数据精准决策,用AI管理创意素材,用智能化平台实现聚合广告投放。WebEye云计算服务与多云管理平台、安全合规服务助力企业全面数字化转型。子品牌ModooPlay为国内外游戏开发者提供全渠道、一站式的游戏发行服务。

返回全部