管理缓存中的数据

数据加载到 Alluxio 后,有效管理对于优化性能、控制资源消耗和确保数据新鲜度至关重要。Alluxio 提供了一套丰富的工具来控制缓存哪些数据、可以消耗多少空间、在缓存中保留多长时间以及其相对于其他数据的重要性。

本指南涵盖四种关键的缓存管理工具:

  • 缓存过滤策略 (Cache Filter Policies) 用于决定哪些文件可以进入缓存以及它们与 UFS 的一致性验证方式。可用的过滤模式包括不可变、完全跳过缓存,或在给定时间窗口内周期性地重新校验数据。

  • 缓存配额 (Cache Quotas) 控制特定目录树可以占用多少缓存空间。随着数据的累积,配额会被强制执行,防止某个租户或数据集独占集群存储。

  • 生存时间 (Time-to-Live, TTL) 规则限定缓存页自被接纳后允许存活的最长时间。即便缓存未满,Worker 也会持续扫描并驱逐已过期的条目。

  • 缓存优先级 (Cache Priority) 在需要释放空间时根据管理员设定的优先级决定先驱逐哪些数据。对于同一优先级的内容,仍使用 LRU(或其他基础驱逐器)确定顺序。

操作指南

这一部分提供每项缓存管理工具的详细操作指南。

控制缓存内容:缓存过滤策略

缓存过滤策略功能默认启用,允许您根据文件路径创建规则,以确定哪些文件应该或不应该被缓存。这对于排除频繁更改的文件、临时文件或缓存后性能提升不大的数据非常有用。

默认情况下,Alluxio 使用不可变 (Immutable) 策略,这意味着它将在首次读取时缓存数据,之后不会检查 UFS 的更新。您可以通过为特定路径定义规则来覆盖此行为。

Alluxio 为文件定义了三种过滤模式:

  • 不可变 (Immutable):文件的内容和元数据永远不会改变。Alluxio 将缓存一次,并且永远不会检查 UFS 的更新。这是默认行为,也是性能最高的选项。

  • 跳过缓存 (Skip Cache):文件的内容和元数据不应在 Alluxio 中缓存。对此文件的所有请求都将直接转发到 UFS。这对于缓存一致性难以维护的高度易变文件是理想选择。

  • 最长存活时间 (Max Age):文件的内容和元数据可能会更改。您可以指定一个持续时间(例如 10m),在此之后缓存的副本被视为过时。Alluxio 将在下次访问时重新检查 UFS 以获取更新版本。

过滤模式示例

以下示例显示了不同过滤规则背后的逻辑。在使用 ETCD 时,您通常会使用 Alluxio CLI 或 REST API 应用这些规则。有关详细的命令用法,请参阅 CLI 指南

不可变:对于永不更改的数据

这是性能最高的选项,应作为大多数数据的默认设置。如果文件标记为 immutable,Alluxio 会缓存一次,并且永远不会检查 UFS 的更新。

一致性:此策略提供强一致性,前提是 UFS 中的源文件确实永不更改。如果源文件在缓存后被修改,Alluxio 将继续提供旧的、过时的版本,导致永久性不一致。

跳过缓存:对于易变或很少使用的数据

如果您有频繁更改的数据(例如临时脚本)或不值得缓存的数据,您可以使用 skipCache 规则将其排除。对这些文件的所有请求都将直接从 UFS 提供。

一致性:此策略提供强一致性,因为它绕过缓存并直接从事实来源(UFS)读取。一致性保证与底层存储系统相同。

最长存活时间:对于有界过时的数据

对于定期更新的数据,您可以设置 maxAge。这告诉 Alluxio 在指定的持续时间内将缓存的数据视为新鲜。持续时间到期后,Alluxio 将在下次访问时检查 UFS 以获取更新版本。

一致性:此策略提供有界过时。客户端可能会读取过时的数据版本,但不会超过指定的 maxAge 持续时间。它在性能和新鲜度之间提供了平衡,但不保证强一致性。

此配置对于可变数据集非常有用,您可以在其中容忍一定程度的过时以换取更高的性能。

若要指定将 defaultType 设置为 maxAge 时的持续时间,请设置 defaultMaxAge

控制缓存多少:缓存配额

缓存配额允许管理员限制特定目录树中文件可以使用的总缓存空间量。这对于多租户环境或确保没有单个数据集或用户可以垄断集群的缓存资源至关重要。

当目录的配额超过时,Alluxio 将采取措施强制执行限制。默认情况下,它将停止为该目录缓存新数据 (NO_CACHE) 并触发驱逐以将使用量恢复到限制以下。

配置

要使用基于目录的配额,您必须在 alluxio-site.properties 中启用该功能并指定Coordinator地址。

您还可以使用 alluxio.quota.limit.exceeded.action 属性控制超出配额限制时的行为。可用的操作有:

  • NO_CACHE (默认):停止在该路径下缓存新数据,但允许从 UFS 提供读取请求。

  • REJECT:拒绝将在该路径下创建缓存数据的新写入请求,并向客户端返回异常。

  • NOOP:继续允许缓存新数据,依靠驱逐来管理空间。如果写入速率高于驱逐速率,这可能不足。

基本操作

您可以使用 alluxio quota CLI 管理配额。有关命令和标志的完整列表,请参阅 CLI 指南

1. 添加配额: 要在 /s3/data 目录上设置 10GB 的配额:

2. 列出配额: 查看所有现有配额及其当前使用情况:

3. 删除配额: 要删除 /s3/data 上的配额:

4. 更新配额: 要更新一个已存在的配额:

配额也可以嵌套。例如,您可以为一个团队的目录分配 10GB 的配额,然后为该团队中的单个项目分配更小的配额。

控制缓存多长时间:生存时间 (TTL)

生存时间 (TTL) 功能允许您为特定目录中的缓存数据定义最大生命周期。一旦文件的缓存持续时间超过其 TTL,Alluxio 会在下一次定期检查期间自动驱逐它。TTL 计时器在数据首次加载到 Alluxio 缓存时启动。

这对于以下情况非常有用:

  • 自动清理临时或时间敏感的数据。

  • 确保过时的数据不会无限期地保留在缓存中。

  • 通过限制敏感数据的生命周期来满足合规性要求。

配置

要使用基于 TTL 的驱逐,您必须在 alluxio-site.properties 中启用该功能:

配置扫描间隔也很关键,它决定了工作节点检查过期数据的频率。

非常短的间隔可能会产生不必要的系统开销。我们建议将其设置为一个平衡清理及时性和性能的值,例如在许多生产场景中为 24h

基本操作

TTL 规则使用 alluxio ttl CLI 进行管理。有关命令和标志的完整列表,请参阅 CLI 指南

1. 添加 TTL 规则:

/s3/daily_reports/ 下的所有文件设置 24 小时 TTL:

2. 删除 TTL 规则:

从ETCD 删除TTL规则:

3. 更新 TTL 规则:

TTL规则添加后可进行更新:

4. 列出 TTL 规则:

查看所有正在生效的 TTL 规则:

与配额一样,TTL 规则是分层的。如果多个 TTL 规则适用于一个文件,则最具体的路径匹配优先。

控制首先驱逐什么:缓存优先级

默认情况下,当缓存空间已满时,Alluxio 使用 LRU(最近最少使用)策略来决定驱逐哪些数据。但是,无论最近访问的时间如何,某些数据都比其他数据更重要。缓存优先级功能允许您为文件分配缓存优先级。

当需要空间时,Alluxio 将始终先驱逐优先级较低的数据,然后再驱逐任何优先级较高的数据。有三个优先级级别:HIGHMEDIUMLOW

这对于保护关键数据集(例如,一系列查询的维度表)不被不太重要的临时作业驱逐非常有用。

配置

要启用缓存优先级,您必须在所有客户端和工作节点上的 alluxio-site.properties 中设置以下属性:

由于优先级规则持久化在 etcd 中,因此您还必须确保正确配置了 etcd 连接详细信息。

基本操作

优先级规则使用 alluxio priority CLI 进行管理。有关命令和标志的完整列表,请参阅 CLI 指南

1. 添加优先级规则: 为关键数据集分配 HIGH 优先级:

2. 列出优先级规则: 查看当前的优先级规则:

3. 删除优先级规则: 删除一条已存在的优先级规则:

4. 更新优先级规则: 更新一条已存在的优先级规则:

对于具有相同优先级级别的文​​件,使用标准驱逐策略(例如 LRU)来确定驱逐顺序。

Last updated