# 管理缓存中的数据

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

本指南涵盖了缓存管理的四个关键方面：

1. **缓存过滤策略**：定义规则以包含或排除某些文件被缓存。
2. **缓存配额**：在特定目录上设置存储限制以管理空间。
3. **生存时间 (TTL)**：在设定的时间段后自动过期和驱逐数据。
4. **驱逐优先级**：影响在需要空间时首先驱逐哪些数据。

## 控制缓存内容：缓存过滤策略

在许多情况下，数据集大于 Alluxio 中可用的缓存容量。**缓存过滤策略**功能允许您根据文件路径创建规则，以确定哪些文件应该或不应该被缓存。这对于排除频繁更改的文件、临时文件或缓存后性能提升不大的数据非常有用。

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

* **不可变 (Immutable)**：文件的内容和元数据永远不会改变。Alluxio 将缓存一次，并且永远不会检查 UFS 的更新。这是性能最高的选项。
* **跳过缓存 (Skip Cache)**：文件的内容和元数据不应在 Alluxio 中缓存。对此文件的所有请求都将直接转发到 UFS。这对于缓存一致性难以维护的高度易变文件是理想选择。
* **最长存活时间 (Max Age)**：文件的内容和元数据可能会更改。您可以指定一个持续时间（例如 `10m`），在此之后缓存的副本被视为过时。Alluxio 将在下次访问时重新检查 UFS 以获取更新版本。

> **关于默认行为的说明** 如果未启用缓存过滤功能 (`alluxio.user.client.cache.filter.enabled=false`)，Alluxio 的行为等同于**不可变**策略。它将在首次读取时缓存数据，之后不会检查 UFS 的更新。

### 配置

要启用和配置缓存过滤策略，您必须首先在 `alluxio-site.properties` 中启用该功能。Alluxio 使用 ETCD 来存储和管理过滤规则，允许您通过 CLI 或 REST API 动态更新它们，而无需重新启动服务。

设置以下属性：

```properties
# 启用缓存过滤功能
alluxio.user.client.cache.filter.enabled=true

# 将 ETCD 设置为规则管理后端
alluxio.user.client.cache.filter.type=ETCD
```

配置后，Alluxio 组件将自动与 ETCD 中存储的规则同步。

### 过滤模式示例

以下示例显示了不同过滤规则背后的逻辑。在使用 ETCD 时，您通常会使用 Alluxio CLI 或 REST API 应用这些规则。有关详细的命令用法，请参阅 [CLI 指南](/ee-ai-cn/ai-3.7/reference/user-cli.md)。

### 不可变：对于永不更改的数据

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

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

```json
{
  "apiVersion": "1",
  "metadata": {
    "defaultType": "immutable"
  },
  "data": {
    "defaultType": "immutable"
  }
}
```

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

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

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

```json
{
  "apiVersion": "1",
  "metadata": {
    "skipCache": ["file://dev/scripts/.*"],
    "defaultType": "immutable"
  },
  "data": {
    "skipCache": ["file://dev/scripts/.*"],
    "defaultType": "immutable"
  }
}
```

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

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

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

```json
{
  "apiVersion": "1",
  "metadata": {
    "maxAge": {"s3://datalake/tables/pipeline/sales/.*": "1h"},
    "defaultType": "immutable"
  },
  "data": {
    "defaultType": "immutable"
  }
}
```

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

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

```json
{
  "apiVersion": "1",
  "metadata": {
    "defaultType": "maxAge",
    "defaultMaxAge": "10min"
  },
  "data": {
    "defaultType": "immutable"
  }
}
```

## 控制缓存多少：缓存配额

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

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

### 配置

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

```properties
# 启用基于目录的集群配额功能
alluxio.quota.enabled=true

# 配置Coordinator地址
alluxio.coordinator.address=<host>:<port>
```

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

* **`NO_CACHE` (默认)**：停止在该路径下缓存新数据，但允许从 UFS 提供读取请求。
* **`REJECT`**：拒绝将在该路径下创建缓存数据的新写入请求，并向客户端返回异常。
* **`NOOP`**：继续允许缓存新数据，依靠驱逐来管理空间。如果写入速率高于驱逐速率，这可能不足。

### 基本操作

您可以使用 `alluxio quota` CLI 管理配额。有关命令和标志的完整列表，请参阅 [CLI 指南](/ee-ai-cn/ai-3.7/reference/user-cli.md)。

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

```shell
$ bin/alluxio quota add --directory /s3/data/ --quota-size 10GB
Successfully added quota definition for path /s3/data/ with size 10GB.
```

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

```shell
$ bin/alluxio quota list
Alluxio path                    	        Capacity	            Used	State
/s3/data                    	             10.00GB	     Calculating	Available
```

**3. 删除配额：** 要删除 `/s3/data` 上的配额：

```shell
$ bin/alluxio quota remove --directory /s3/data
Successfully removed quota definition for path /s3/data.
```

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

```console
$ bin/alluxio quota update --directory /local/data/ --quota-size 100GB
```

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

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

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

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

* 自动清理临时或时间敏感的数据。
* 确保过时的数据不会无限期地保留在缓存中。
* 通过限制敏感数据的生命周期来满足合规性要求。

### 配置

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

```properties
alluxio.ttl.policy.enabled=true
```

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

```properties
# 默认为 1 小时。为生产环境设置更长的间隔。
alluxio.ttl.eviction.check.interval=1h
```

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

### 基本操作

TTL 规则使用 `alluxio ttl` CLI 进行管理。有关命令和标志的完整列表，请参阅 [CLI 指南](/ee-ai-cn/ai-3.7/reference/user-cli.md)。

**1. 添加 TTL 规则：**

为 `/s3/daily_reports/` 下的所有文件设置 24 小时 TTL：

```shell
$ bin/alluxio ttl add --path /s3/daily_reports/ --time 24h
Added alluxioPath=/s3/daily_reports/ and time=24h
```

**2. 删除 TTL 规则：**

从ETCD 删除TTL规则：

```console
$ bin/alluxio ttl remove --path /s3/test_folder
Removed TTL policy for alluxioPath=/s3/test_folder/
```

**3. 更新 TTL 规则：**

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

```console
$ bin/alluxio ttl update --path /s3/test_folder/ --time 30min
Updated alluxioPath=/s3/test_folder/ and time=30min

$ bin/alluxio ttl update --path /s3/test_folder/ --time 5s
Warning: You are setting TTL policy to 5s. This TTL is too small. Note that expired cache are scanned and evicted every 1h. Please consider making this TTL larger with `bin/alluxio ttl update` command.
Updated alluxioPath=/s3/test_folder/ and time=5s
```

**4. 列出 TTL 规则：**

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

```shell
$ bin/alluxio ttl list
Listing all TTL policies
/s3/daily_reports/     TTL: 24 hours
```

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

## 控制首先驱逐什么：驱逐优先级

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

当需要空间时，Alluxio 将始终先驱逐优先级较低的数据，然后再驱逐任何优先级较高的数据。有三个优先级级别：`HIGH`、`MEDIUM` 和 `LOW`。

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

### 配置

要启用优先级驱逐，您必须在所有客户端和工作节点上的 `alluxio-site.properties` 中设置以下属性：

```properties
alluxio.worker.page.store.evictor.priority.enabled=true
```

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

### 基本操作

优先级规则使用 `alluxio priority` CLI 进行管理。有关命令和标志的完整列表，请参阅 [CLI 指南](/ee-ai-cn/ai-3.7/reference/user-cli.md)。

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

```shell
$ bin/alluxio priority add --path s3://bucket/critical_data --priority high
```

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

```shell
$ bin/alluxio priority list
```

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

```console
$ bin/alluxio priority remove --path s3://bucket/data
```

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

```console
$ bin/alluxio priority update --path s3://bucket/data --priority medium
```

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.alluxio.io/ee-ai-cn/ai-3.7/cache/managing-data-in-the-cache.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
