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

通过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`。该设置主要用于分批获取大量文件元数据，避免单次请求返回数据过大，造成内存压力或网络阻塞。适当减小该值可以提升系统的响应稳定性，尤其是在包含大量子文件/子目录的大目录结构中非常有用。
