# 网络附加存储 NAS

本指南介绍如何将 [NAS](https://en.wikipedia.org/wiki/Network_File_System)配置为 Alluxio 底层存储系统的操作步骤。 NAS（Network Attached Storage）是一种通过网络（如以太网）提供集中存储服务的设备或架构，支持多协议（如NFS、SMB、AFP等），允许客户端访问共享存储资源， 它常用于跨网络环境访问远程文件，在 Linux 系统中常用于共享存储。有关 NAS 和 NFS 的更多信息，请参考 [Ubuntu NFS 文档](https://ubuntu.com/server/docs/service-nfs)。

Alluxio支持两种方式，将 NAS 用作 Alluxio 的底层文件系统（UFS）：

1. 将 NAS 挂载到本地文件系统，Alluxio 会像操作本地文件系统一样操作 NAS 中的文件；
2. 使用 NFS 客户端完成对 NAS 的所有文件操作。

***

## 通过 host path 使用 NAS

当使用 Operator 部署 Alluxio 集群时，可以通过设置 `hostPaths` 字段，将节点上的 NAS 路径挂载到 Worker 容器中的路径：

```yaml
apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  hostPaths:
    coordinator:
      /mnt/nas: /ufs/data
    worker:
      /mnt/nas: /ufs/data
    fuse:
      /mnt/nas: /ufs/data
```

其中 `/mnt/nas` 是 NAS 在节点上的挂载路径。

使用 Operator 创建挂载点的 `ufs.yaml` 示例：

```yaml
apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-nas
  namespace: alx-ns
spec:
  alluxioCluster: alluxio-cluster
  path: file:///ufs/data
  mountPath: /nas
```

如果不使用 Operator，可以使用以下命令将 `/mnt/nas` 挂载到 Alluxio 的 `/nas` 路径下：

```shell
bin/alluxio mount add --path /nas/ --ufs-uri file:///mnt/nas
```

***

## 通过 NFS 客户端使用 NAS

### 前提条件

在将 NAS 配置为 Alluxio 的底层存储系统之前，请确保您满足以下要求：

| `<NAS_SERVER_IP>` | 托管共享目录的 NAS 服务器的 IP 地址。                   |
| ----------------- | ----------------------------------------- |
| `<SHARED_DIR>`    | NAS 服务器上导出的目录的绝对路径（例如：`/nas_share`）。      |
| `<CLIENT_RANGE>`  | 被允许访问共享目录的客户端 IP 范围（例如：`192.168.1.0/24`）。 |
| `<NAS_VERSION>`   | NAS 协议版本（Alluxio 当前**仅支持 v3**）。           |

### 基本配置

使用 [挂载表操作](https://documentation.alluxio.io/ee-ai-cn/ai-3.6/ufs/pages/vItTjDEwYA3ygh6WezO1#挂载表操作)来增加一个新的挂载点, 指定Alluxio路径在其上创建挂载，指定NAS导出的路径作为UFS URI。NAS服务器的IP地址、用户ID和用户组ID等配置选项也可以通过指定 `--option` 标志作为挂载命令的一部分来指定，如[配置挂载点](https://documentation.alluxio.io/ee-ai-cn/ai-3.6/ufs/pages/vItTjDEwYA3ygh6WezO1#对不同挂载点使用不同的配置)所述。

通过K8s的operator来创建一个挂载点如下：

```yaml
apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-nas
  namespace: alx-ns
spec:
  alluxioCluster: alluxio-cluster
  path: nas://<NAS_SERVER_AUTHORITY>/<NAS_EXPORT_PATH>/
  mountPath: /nas
  mountOptions:
    fs.nas.ipAddress: <NAS_SERVER_IP>
    fs.nas.uid: "0"
    fs.nas.gid: "0"
    fs.nas.service.version: "3"
```

将`nas://<NAS_SERVER_AUTHORITY>/<NAS_EXPORT_PATH>/` 挂载至 `/nas` 的命令示例如下：

```shell
bin/alluxio mount add --path /nas \
  --ufs-uri "nas://<NAS_SERVER_AUTHORITY>/<NAS_EXPORT_PATH>/" \
  --option fs.nas.ipAddress=<NAS_SERVER_IP> \
  --option fs.nas.uid=0 \
  --option fs.nas.gid=0 \
  --option fs.service.version=3
```

请注意，如果要挂载 NAS 导出路径的根目录，请在导出路径后添加斜线（如 `nas://<NAS_SERVER_AUTHORITY>/<NAS_EXPORT_PATH>/`），`NAS_SERVER_AUTHORITY` 是一个用户可以自定义的具有唯一性的字段，用来唯一地代表某个NAS sever，比如有两个NAS server都需要mount到Alluxio上，`NAS_SERVER_AUTHORITY`可以分别为`nas_1`和`nas_2`来区分两个不同的NAS server。

### 进阶配置

在使用 Alluxio 挂载和访问 NAS（Network Attached Storage）时，为了优化性能和资源利用率，可以通过调整部分底层文件系统相关参数，实现更精细化的控制。以下是两个常用的配置项说明：

#### 1. 调整从 NAS 读取数据时的缓冲区大小

```properties
alluxio.underfs.nas.inputstream.max.buffer.size=8MB
```

该参数用于设置从 NAS 读取数据时，输入流所使用的最大缓冲区大小。默认值为 `8MB`，该缓冲区用于在读取文件内容时缓存数据，从而减少与底层存储的交互次数。增大该值通常可以提升顺序读取性能，特别是在读取大文件时效果更为显著。但需要注意，如果缓冲区设置过大，可能会增加内存使用，建议根据实际业务场景和节点内存情况进行调优。

#### 2. 设置目录列表操作（ls）的响应大小限制

```properties
alluxio.underfs.nas.liststatus.iterable.max.byte.size.per.response=4MB
```

该参数用于控制在执行 `ls` 操作（如 `listStatus()`）时，每个响应所能包含的最大字节数。默认值为 `4MB`。该设置主要用于分批获取大量文件元数据，避免单次请求返回数据过大，造成内存压力或网络阻塞。适当减小该值可以提升系统的响应稳定性，尤其是在包含大量子文件/子目录的大目录结构中非常有用。


---

# 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.6/ufs/nas.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.
