从缓存中删除数据

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

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

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

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

自动驱逐

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

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

工作原理

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

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

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

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

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

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

异步驱逐

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

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

# 启用后台异步驱逐
alluxio.worker.page.store.async.eviction.enabled=true
# 每分钟检查一次缓存使用情况
alluxio.worker.page.store.async.eviction.check.interval=1min
# 当使用率达到 90% 时开始驱逐
alluxio.worker.page.store.async.eviction.high.watermark=0.9
# 当使用率降至 80% 时停止驱逐
alluxio.worker.page.store.async.eviction.low.watermark=0.8

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

手动驱逐:free 作业

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

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

使用 CLI

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

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

$ bin/alluxio job free --path s3://bucket/path --submit

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

$ {ALLUXIO_HOME}/bin/alluxio job free --path s3://alluxio/path --progress
Progress for Free path file 's3://alluxio/path':
	Job Id: b21ce9fb-f332-4d39-8bb4-554f9a4fa601
	Job Submitted: Fri Feb 02 21:28:56 CST 2024
	Job path: s3://alluxio/path
	Job State: SUCCEEDED, finished at Fri Feb 02 21:29:01 CST 2024
	Free Info :	totalFile:4 totalByte:3072.00KB
	Free Files Failed: 0
	Free Bytes Failed: 0B
	Free Files Succeeded: 4
	Free Bytes Succeeded: 3072.00KB

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

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

使用 REST API

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

过时缓存清理

过时缓存是指存在于工作节点上但根据集群的一致性哈希环不再“属于”该工作节点的数据。这可能在以下几种情况下发生:

  • 集群调整大小:当您添加或删除工作节点时,文件的所有权可能会发生变化。以前由一个工作节点拥有的数据现在可能属于另一个工作节点。

  • 副本减少:如果您减少文件的复制因子(例如,从 3 减少到 2),一个工作节点将留下一个现在多余的副本。

  • 工作节点临时不可用:如果一个工作节点脱机,其职责被其他工作节点临时接管,那么在原始工作节点重新加入集群后,这些其他工作节点可能会持有过时的数据。

这些过时的数据会消耗宝贵的缓存空间而不会带来任何好处,因为它不会提供给客户端。

工作原理

过时缓存清理操作指示每个工作节点扫描其本地存储,根据当前哈希环验证每个文件的所有权,并删除其不再拥有的任何数据。

这是一项专门的管理任务,旨在在动态集群环境中保持缓存的卫生。

用法

此功能目前可通过 REST API 使用。要触​​发所有工作节点的过时缓存清理作业,请参阅 REST API 指南以获取端点详细信息和示例。

示例请求如下所示:

curl -X POST <coordinator-host>:<coordinator-api-port>/api/v1/cache -d '{"op":"clear-stale"}' -H "Content-Type: application/json"

这会向每个工作节点提交一个异步作业。您可以通过检查工作节点日志或观察 alluxio_cleared_stale_cached_data Prometheus 指标来监控进度,该指标跟踪每个工作节点上清除的过时数据总字节数。

Last updated