从缓存中移除数据

虽然 Alluxio 的自动驱逐策略(如 LRU、TTL 和配额)处理了大部分缓存清理工作,但有时您需要手动或系统地移除数据。本指南涵盖了从 Alluxio 缓存中移除数据的三种主要机制:

  1. 自动驱逐:由缓存容量和策略驱动的标准过程。

  2. 手动驱逐:使用作业强制移除特定文件或目录。

  3. 过时缓存清理:一种专门的清理方法,用于移除集群更改后放错位置的数据。

自动驱逐

自动驱逐是数据从缓存中移除的最常见方式。当工作节点的缓存存储达到其容量并需要为新数据腾出空间时,就会触发该机制。驱逐过程由您定义的策略控制。

注意: 除了此处描述的基于容量的驱逐外,Alluxio 还提供高级驱逐策略,如生存时间 (TTL) 和缓存优先级。这些策略允许您根据数据的年龄或重要性移除数据,从而对缓存进行更精细的控制。您可以在管理缓存中的数据指南中了解更多信息。

工作原理

当工作节点需要写入新数据页但其缓存已满时,它会运行一个驱逐器来选择并移除现有数据页。主要的驱逐策略有:

  • LRU (最近最少使用):默认策略。它会驱逐最长时间未被访问的数据。

  • LFU (最不经常使用):驱逐被访问次数最少的数据。

  • FIFO (先进先出):驱逐最先写入的数据。

您可以在 alluxio-site.properties 中配置驱逐策略:

# 设置工作节点缓存的驱逐策略
alluxio.worker.page.store.evictor.type=LRU

异步驱逐

为了避免在写入操作期间同步驱逐导致的性能下降,Alluxio 还执行后台异步驱逐。此过程会定期检查缓存使用情况并主动驱逐数据以维持可用空间。

您可以配置高低“水位线”来控制此过程:

此设置可确保几乎总有空间可用于新写入,从而最大限度地减少延迟。

手动驱逐:free 作业

有时您需要明确地从缓存中移除数据,即使有足够的可用空间。例如,您可能希望在作业完成后清除数据集,以便为下一个作业腾出空间。

您可以使用 CLI 或 REST API 触​​发手动驱逐。

使用 CLI

job free 命令允许您手动触​​发驱逐指定 UFS 路径内或文件列表中的所有数据。有关命令和标志的完整列表,请参阅 CLI 指南

要释放 s3://bucket/path 路径下的所有缓存数据:

您可以监控释放作业的进度:

您可以中断一个正在执行的free作业。注意,这会将未释放的文件遗留在缓存中。

此操作对于管理任务以及让应用程序所有者直接控制其数据的缓存生命周期非常有用。

使用 REST API

您还可以通过 REST API 以编程方式触​​发和管理释放作业。这对于将手动驱逐集成到自动化工作流程中非常有用。有关更多详细信息,请参阅 REST API 指南。

过时缓存清理 (Stale Cache Cleaning)

集群拓扑结构的变化或数据生命周期的变动有时会在 Worker 上留下“过时 (stale)”的数据。本节介绍如何清理这些过时条目以回收空间。

清理过时数据

过时数据是指缓存在 Worker 上,但根据集群的一致性哈希环,不再“属于”该 Worker 的文件内容。这种情况可能在以下几种情形下发生:

  • 集群扩缩容:当添加或移除 Worker 时,文件的归属权会发生变化。原本属于某个 Worker 的数据现在可能属于另一个 Worker。

  • 副本数减少:如果你降低了文件的副本因子(例如,从 3 降到 2),某个 Worker 可能会保留不再需要的副本。

  • Worker 暂时不可用:如果一个 Worker 掉线,其工作负载被临时重新分配给其他 Worker,当原 Worker 重新加入后,那些临时接管的 Worker 可能会保留它们不再拥有的缓存数据。

这些过时数据会占用缓存空间但毫无用处,因为它不会被提供给客户端。

工作原理

过时数据清理操作会指示每个 Worker 扫描其本地存储,根据当前的哈希环验证每个块的归属权,并移除它不再拥有的任何数据。

用法

此操作可通过 REST API 使用。要触发所有 Worker 的过时缓存清理任务:

这会向每个 Worker 提交一个异步任务。你可以通过查看 Worker 日志或 alluxio_cleared_stale_cached_data Prometheus 指标来监控进度。有关详细信息,请参阅 REST API 文档。

注意

批量移除大量文件可能会引发元数据 I/O 阻塞内核刷盘,导致 Worker Pod 终止时间延长。

Last updated