这是一个系列博客。介绍的是Meta如何通过弃用产品、清理代码、删除数据以实现降本增效。这对于效能平台的建设非常具有指导意义。
上一篇介绍的是如何自动清理死代码,本篇介绍如何自动化删除数据。也是本系列的最后一篇。
文章最后有原文链接和我个人的总结。懒的同学,可以翻到文章最后。
译文:
这是我们关于Meta系统代码和资产移除框架(SCARF)系列的第三篇也是最后一篇文章。SCARF 包含多个子系统,可分析整个Meta系统中的代码和数据使用情况,从而帮助安全、高效地移除弃用产品。在第一篇关于自动化产品报废的文章中,我们讨论了产品报废的复杂性,并介绍了 SCARF 的工作流管理工具,该工具可引导工程师通过协调流程安全地报废产品。在第二篇关于自动清理死代码的文章中,我们讨论了SCARF的死代码子系统及其分析代码静态和动态使用情况的能力,从而自动生成更改请求以删除未使用的代码。在整个系列文章中,我们都提到了一个名为 "Moments "的照片分享应用的弃用例子,该应用于2015年推出,最终于2019年关闭。
在这篇文章中,我们将介绍Meta负责自动识别和安全删除未使用数据类型的子系统。这个过程可能会遇到意想不到的困难,因为大型软件系统不可避免地相互关联。Moments依赖于多个共享的 Facebook功能和基础设施,删除它比简单地关闭服务器和删除数据表要复杂得多。
未使用数据清理
SCARF实现了一个未使用数据类型清理系统,Meta工程师可在需要确保一致地删除未使用数据时加以利用。SCARF扫描数据系统,以识别存储的每种数据类型(例如,识别关系数据库中的所有表),并确定每种数据是否正在使用。如果有任何资产未被使用,SCARF 就会启动一个程序,安全地删除这些资产。
SCARF跟踪的数据类型各不相同,包括数据库表、共享存储系统中的分区“用例”或对象类等。每种数据都代表一类数据,而不是单个记录。Meta有一个单独的系统DELF,用于删除单个记录、行和对象。
SCARF 协调每个数据系统的几种任务:元数据收集(如数据数量、字段类型)、使用情况收集、分析和操作。这些任务有一些共同的组成部分,并遵循标准化格式;但是,每个支持的数据系统都有其固有的实施方式。
度量使用情况
SCARF 跟踪两个主要指标来确定删除是否安全:SCARF 通过识别查询数据类型的代码来衡量静态使用情况;通过观察生产中的访问模式来衡量运行时使用情况。
正如我们在博文《自动清理死代码》中提到的,SCARF 使用 Glean 对 Meta 的代码库进行静态分析。Glean 以索引化、标准化的格式呈现从编译器中提取的静态分析结果。SCARF 可通过查询 Glean 来查找似乎引用了各类数据的代码。例如,存储在 Meta 对象图数据系统 TAO 中的每种数据类型都有一个枚举值作为引用:我们可以找到每种枚举值在多种语言代码中的用法。
viewed_photo = TAO.fetch(id=objectId,type=TAOType.USER_VIEWED_PHOTO,
)
SCARF还度量每种数据类型在运行时的使用情况。我们通过在Meta的数据系统中添加计数器来仪表化,显示每种数据类型从数据源(如来自我们Web服务器群的生产流量)接收了多少读取,同时忽略由备份基础设施产生的流量。
我们的一些数据系统,如 TAO,每秒接收数十亿次请求。对这种规模的数据系统进行仪表化,同时确保我们只测量特定类型的使用情况,对避免代价高昂的性能下降提出了复杂的工程挑战。
协调删除
一旦SCARF检测到某种数据类型完全未被使用,通过结合我们的元数据、流量分析和代码引用的信号,它会通过内部工单通知负责该数据类型的工程团队,清理将继续进行。
经过一段配置时间后,SCARF会通过数据系统特定机制阻止所有读写操作。这段时间非常重要,因为它可以作为数据真正删除时的模拟运行。一旦这段时间过去,数据就会被删除。系统会保存一个内部日志,记录它为我们的记录所执行的操作。
例如,如果 TAO 中的某类数据没有代码引用或生产流量,在发出通知并等待是否有反对意见后,SCARF 将指示 TAO 在服务试图读取或写入该类数据时提示错误。在进一步的监控阶段之后,它将指示 TAO 删除数据。
请注意,SCARF在提交内部请求时不会等待工程师的确认 - 系统偏向于自动删除未使用的数据类型,并依靠其彻底的分析来确保仅删除未使用的数据。如果某些数据闲置的时间足够长,那么当自动化清理它时,出现问题的可能性就会越来越小。偏向于自动化可以提高效率,并使系统能够超越需要手动批准每个操作的流程。
如果出现错误,访问限制期可作为一个缓冲期,在数据删除之前,任何错误都可以被发现,我们的分析也可以更新,以考虑到任何缺失的信号。在最坏的情况下,如果数据被删除但本不应该删除,Meta 的许多系统都会提供备份,以防止数据丢失。
工程师可以通过多种方式与 SCARF 的删除流程进行交互。如前所述,他们可以覆盖 SCARF 检测到的使用信号,以便继续进行删除,如果他们确定这些信号是假阳性信号的话。他们还可以通过缩短等待时间来加快进程。最后,工程师可以将他们注意到的问题反馈给我们构建 SCARF 的团队:在 SCARF 收集到的使用信号中,工程师经常会发现假阳性(SCARF 检测到某物已被使用,但实际并未使用),很少会发现假阴性(SCARF 检测到无使用,但实际有使用)。
处理跨系统依赖关系
Meta 有许多不同的数据存储系统,其中许多系统都是专门用于某种用途的。一个高质量的产品往往需要多个不同数据系统的功能。例如,TAO 是一个图形数据库,擅长为许多小型快速查询提供服务,但它不能用于机器学习、排名或聚合等任务。因此,Meta 经常为单个产品利用多个数据存储系统,包括在系统间移动数据的数据管道。因此,SCARF 必须了解这些系统之间的相互联系,以确保数据从每个存储位置移除,并防止数据删除顺序发生错误。
SCARF通过一套已生成的资产关系进行建模。对于给定的资产及其相应的入站和出站依赖关系,SCARF 会确定关系的性质,从而决定必须先删除哪个资产,以及删除一个资产是否需要删除另一个资产。例如,有些资产的存在完全是系统间数据移动的结果,必须在多步骤过程中一起删除。SCARF 中的这种系统关系建模能够更彻底地协调数据清理工作,并防止系统尝试删除不按顺序排列的资产。
处理代码使用情况
将Meta的代码和数据定义视为单个依赖图,SCARF可以被视为修剪该图中的叶子和孤立节点的系统。这个依赖图随着每一项工程工作的进行而随时间而变化,每个工程工作都会产生新的节点和边。
如果 SCARF识别出可以使用该数据的代码,即使该代码没有运行,它也无法自动删除数据:根据设计,SCARF不会破坏该图中的边。例如,如果工程师出于调试目的提交引用TAO中某种数据类型的脚本,SCARF会正确地将其识别为对用例的引用并防止删除 - 即使该脚本不再使用。
如本系列第二部分中所述,SCARF的死代码子系统通过自动删除已知的死代码来帮助解决这个问题。如果死代码系统能够删除未使用的脚本,那么未使用的数据也可以被删除。
大规模删除数据
删除未使用的数据类型不仅简化了我们的内部基础设施,而且还节省了容量成本。在过去的一年里,我们删除了存储在 21 个不同数据系统中的 1280 万种不同数据类型的 PB 级闲置数据。在许多产品中,单个数据可能包含标识符(主键)和少量数据,但在Meta的规模下,有数十亿个这样的行。在我们的仓库中,以及在我们的备份中,我们的服务在例行使用中记录的数据,提供分析、操作日志或分析,也包含了数十亿行,乘以历史数据的保留以及我们的备份。
SCARF 每天同时对数百万资产进行操作,大大减少了我们团队手动干预和清理未使用数据的开销。维护 SCARF 的团队与我们构建和维护这些不同数据系统的同事建立了牢固的合作关系,充分利用他们的专业知识,共同提供SCARF调用的API,以安全地限制数据访问并最终清理数据。
SCARF 每天都在运行:产品和功能的生命周期意味着每天都有新的数据类型产生,同时每天也有闲置的数据类型产生。定期运行系统可确保在资产的最后引用被删除时,SCARF能够迅速捕捉到这些变化,并触发相关的自动化。
SCARF摘要
SCARF 为公司的工程团队提供了一套强大的工具。它的工作流程管理工具为数以千计的人工废止项目提供了支持,同时还自动清理了数以百万计的代码和数据资产。
SCARF 对 Meta 的隐私团队也很有用:我们可以使用该工具监控正在进行的产品废止工作的进度,确保它们及时完成。当我们的自动化系统无法完成某些工作时,SCARF 的内部工具会让工程师了解他们需要做什么以及如何安全地完成这些工作。SCARF提供的信息并不是泛泛而谈的:它针对工程师正在删除的特定代码和数据量身定制,使他们能够以最高效的方式做出正确的决定。
通过讨论像SCARF这样的隐私创新,我们希望为我们在基础设施方面的持续投资创造透明度,从而为使用我们产品和服务的用户提供隐私保护。我们致力于自动化和协调未使用代码和数据的全面删除,这只是我们在 Meta 专注于实质性隐私设计措施的一个例子。
即使像Meta这样复杂而庞大的基础设施,也可以安全、高效、彻底地进行产品弃用处理。将自动化与工程工具相结合是一种久经考验的策略,我们发现这种策略非常有效。我们在这一领域的投资是长期的,因为产品报废是数据生命周期的一个持续部分,这有助于像Meta这样的大型科技公司取得持续成功。
=译文完=
原文链接:https://engineering.fb.com/2023/10/31/data-infrastructure/automating-data-removal/
个人总结
• 自动删除未使用的数据目的:
• 简化内部基础设施、节省容量成本;
• 减少团队管理数据资产的开销。
• 如何检测出数据是否应该被删除?未被引用的数据,则会被启动删除程序进行删除。
• 通过识别查询数据类型的代码来衡量静态使用情况。
• 通过观察生产中的访问模式来衡量运行时使用情况。
• 如何处理误删
• 由备份系统垫底
• SCARF的工作步骤:
1. 每日检测是否存在未被使用的数据;
2. 检测到未被使用的数据,提工单给负责该数据的工程团队;
3. 工程团队配置时间(指的是数据保留的最后期限,也叫访问限制期。模拟数据被删除的场景一段时间);
4. 在访问限制期内,如果有服务要访问这个数据,相应的数据系统会报错。这一行为由SCARF指示;
5. 当到了配置的时间点后,数据会被SCARF自动删除,并记录下操作日志。
• 在SCARF中,资产的被删除顺序是如何确定的:SCARF 通过一套已生成的资产关系进行建模。对于给定的资产及其相应的入站和出站依赖关系,SCARF 会确定关系的性质,从而决定必须先删除哪个资产,以及删除一个资产是否需要删除另一个资产。
本系列前两篇文章:
Meta降本增效大招之:自动清理死代码
Meta降本增效大招之:弃用产品