openEuler 22.03 NFS + mergerfs 分布式存储池部署完整文档


文档概述

本文档详细记录了在 openEuler 22.03 系统上,将多台存储服务器的 /bak 目录通过 NFS 共享,并在客户端使用 mergerfs 合并为统一存储池的完整流程。

架构示意图

┌─────────────────────────────────────────────────────────────────┐
│                     客户端服务器 (192.168.20.3)                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              /bak (mergerfs 统一挂载点)                  │   │
│  │  总容量 = 本地138T + NFS14 139T + NFS19 139T + ...     │   │
│  └─────────────────────────────────────────────────────────┘   │
│         │              │              │              │          │
│         ▼              ▼              ▼              ▼          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐       │
│  │localbak  │  │ nfs14    │  │ nfs19    │  │ nfs20    │       │
│  │(本地存储)│  │(NFS挂载) │  │(NFS挂载) │  │(NFS挂载) │       │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘       │
└─────────────────────────────────────────────────────────────────┘
         │              │              │              │
         ▼              ▼              ▼              ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 本地存储设备 │ │192.168.20.14│ │192.168.20.19│ │192.168.20.20│
│ /bak 138T   │ │ /bak 139T   │ │ /bak 139T   │ │ /bak 139T   │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘

第一部分:存储服务器(NFS 服务端)配置

适用于所有需要共享 /bak 目录的存储服务器(如 192.168.20.14、192.168.20.19、192.168.20.20 等)。

1.1 安装 NFS 服务

sudo dnf install -y nfs-utils

NFS 服务的实现依赖于 RPC(Remote Procedure Call)机制,RPC 服务(rpcbind)负责统一管理 NFS 的动态端口。

1.2 启动并启用服务

按照正确的顺序启动服务:必须先启动 rpcbind,再启动 nfs-server,因为 NFS 服务需要向 RPC 注册端口信息。

sudo systemctl enable rpcbind nfs-server
sudo systemctl start rpcbind
sudo systemctl start nfs-server

1.3 配置共享目录(/etc/exports)

编辑 NFS 核心配置文件 /etc/exports,定义需要共享的目录和访问权限:

sudo vi /etc/exports

添加以下内容(将 192.168.20.3 替换为实际的客户端 IP):

/bak 192.168.20.3(rw,sync,no_root_squash,no_subtree_check)

参数说明

参数 说明
/bak 要共享的目录
192.168.20.3 允许访问的客户端 IP(可指定网段如 192.168.20.0/24
rw 可读可写
sync 同步写入磁盘,数据更安全(推荐生产环境使用)
async 异步写入,性能更高但有数据丢失风险(谨慎使用)
no_root_squash 允许客户端 root 用户保持 root 权限(有安全风险,按需使用)
no_subtree_check 禁用子目录检查,提升性能

安全建议:生产环境中建议使用 rw,sync,no_root_squash 并严格限制客户端 IP。

1.4 使配置生效

sudo exportfs -r

修改 NFS 配置后无需重启服务,执行 exportfs -r 即可使 /etc/exports 的变更生效。

验证共享是否成功:

sudo exportfs -v
# 或
showmount -e localhost

1.5 配置防火墙

如果防火墙已开启,需要放行 NFS 相关服务:

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload

说明:NFS 依赖 RPC 服务,需要放行 rpcbind(端口 111)和 nfs(端口 2049)等相关服务。


第二部分:客户端服务器配置

在客户端服务器(192.168.20.3)上执行以下操作。

2.1 安装 NFS 客户端工具

sudo dnf install -y nfs-utils

2.2 准备本地存储

如果客户端有本地存储设备(如 /dev/mapper/vgdata-lvdata,138TB),需要将其挂载到独立目录供 mergerfs 使用:

# 创建挂载点
sudo mkdir -p /mnt/localbak

# 挂载本地存储设备(请根据实际设备路径调整)
sudo mount /dev/mapper/vgdata-lvdata /mnt/localbak

2.3 挂载远程 NFS 存储

为每个远程存储服务器创建独立的挂载点并挂载:

# 创建挂载点
sudo mkdir -p /mnt/nfs14 /mnt/nfs19

# 挂载远程存储(使用性能优化参数)
sudo mount -t nfs -o rw,hard,intr,rsize=1048576,wsize=1048576,noatime 192.168.20.14:/bak /mnt/nfs14
sudo mount -t nfs -o rw,hard,intr,rsize=1048576,wsize=1048576,noatime 192.168.20.19:/bak /mnt/nfs19

挂载参数说明

参数 说明
rw 读写模式
hard 硬挂载,请求会持续重试直到成功,保证数据一致性
intr 允许中断卡住的 NFS 操作
rsize=1048576 读取块大小设为 1MB,提升大文件传输吞吐量
wsize=1048576 写入块大小设为 1MB
noatime 不更新访问时间戳,减少元数据写入开销

验证挂载是否成功:

df -h /mnt/nfs14 /mnt/nfs19

第三部分:mergerfs 存储池配置

3.1 安装 mergerfs

# 从 GitHub 下载 RPM 包安装(以 2.40.2 版本为例)
wget https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs-2.40.2-1.el8.x86_64.rpm
sudo dnf install -y ./mergerfs-2.40.2-1.el8.x86_64.rpm

最新版本请访问 mergerfs releases 获取。

3.2 创建 mergerfs 合并挂载点

# 如果 /bak 已存在且被占用,先处理
sudo umount /bak 2>/dev/null
sudo mkdir -p /bak

3.3 挂载 mergerfs(合并所有分支)

将所有存储分支(本地 + 所有远程 NFS)合并到 /bak

sudo mergerfs -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak

参数说明

参数 说明
defaults 使用默认选项
allow_other 允许其他用户访问(需在 /etc/fuse.conf 中启用 user_allow_other
category.create=mfs 创建新文件时选择剩余空间最多的分支(most free space)
minfreespace=10240G 每个分支至少保留 10TB 空闲空间

3.4 验证合并结果

# 查看总容量(应约为所有分支容量之和)
df -h /bak

# 查看各分支独立容量
df -h /mnt/localbak /mnt/nfs14 /mnt/nfs19

# 查看文件列表
ls /bak

第四部分:开机自动挂载(systemd 服务)

4.1 配置 /etc/fstab

编辑 /etc/fstab,确保所有存储分支在开机时自动挂载:

sudo vi /etc/fstab

添加以下内容:

# 本地存储(挂载到 /mnt/localbak,而非 /bak)
/dev/mapper/vgdata-lvdata /mnt/localbak xfs defaults 0 0

# 远程 NFS 存储
192.168.20.14:/bak /mnt/nfs14 nfs rw,hard,intr,rsize=1048576,wsize=1048576,noatime,_netdev 0 0
192.168.20.19:/bak /mnt/nfs19 nfs rw,hard,intr,rsize=1048576,wsize=1048576,noatime,_netdev 0 0

_netdev 选项确保网络就绪后再尝试挂载 NFS,避免系统启动卡住。

测试 fstab 配置是否正确:

sudo mount -a

4.2 创建 systemd 服务

创建服务文件 /etc/systemd/system/mergerfs-bak.service

sudo vi /etc/systemd/system/mergerfs-bak.service

写入以下内容:

[Unit]
Description=Mergerfs pool for /bak
Requires=network-online.target
After=network-online.target remote-fs.target
Wants=remote-fs.target

[Service]
Type=simple
ExecStartPre=/bin/mount -a
ExecStart=/usr/bin/mergerfs -f -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak
ExecStop=/bin/umount /bak
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意

  • Type=simple:mergerfs 默认在前台运行。
  • -f 选项:强制前台运行,确保 systemd 能正确管理进程。
  • ExecStartPre=/bin/mount -a:确保 fstab 中的所有挂载已生效。

4.3 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable mergerfs-bak.service
sudo systemctl start mergerfs-bak.service
sudo systemctl status mergerfs-bak.service

第五部分:热添加新 NFS 分支(在线扩容)

当需要添加新的存储服务器(如 192.168.20.20)时,可以使用 mergerfs 的运行时接口进行热添加,无需停机

5.1 挂载新 NFS 到临时目录

sudo mkdir -p /mnt/nfs20
sudo mount -t nfs -o rw,hard,intr,rsize=1048576,wsize=1048576,noatime 192.168.20.20:/bak /mnt/nfs20

5.2 验证挂载成功

df -h /mnt/nfs20

5.3 通过控制接口热添加分支

mergerfs 提供了伪文件 /mountpoint/.mergerfs 用于运行时修改配置和执行命令。

echo "add /mnt/nfs20" | sudo tee /bak/.mergerfs/ctl

或者使用 setfattr 命令:

sudo setfattr -n user.mergerfs.branches -v "+>/mnt/nfs20" /bak/.mergerfs

5.4 验证扩容成功

df -h /bak
# 总容量应增加约 139TB

5.5 持久化配置(确保重启后保留)

① 更新 /etc/fstab

echo '192.168.20.20:/bak /mnt/nfs20 nfs rw,hard,intr,rsize=1048576,wsize=1048576,noatime,_netdev 0 0' | sudo tee -a /etc/fstab

② 更新 systemd 服务文件

编辑 /etc/systemd/system/mergerfs-bak.service,在分支列表中添加 /mnt/nfs20

ExecStart=/usr/bin/mergerfs -f -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19:/mnt/nfs20 /bak

③ 重载 systemd

sudo systemctl daemon-reload

第六部分:性能优化

针对 64 核 188GB 内存的高性能服务器,可以进行以下优化:

6.1 NFS 客户端参数优化

在挂载时使用以下参数:

mount -t nfs -o \
  rw,hard,intr,\
  rsize=4194304,wsize=4194304,\
  noatime,nodiratime,\
  timeo=300,retrans=3,\
  tcp \
  192.168.20.14:/bak /mnt/nfs14
参数 说明
rsize=4194304 读取块大小设为 4MB(需服务端支持)
wsize=4194304 写入块大小设为 4MB
nodiratime 禁用目录访问时间更新
timeo=300 超时时间设为 30 秒(局域网环境可适当降低)
retrans=3 重传次数

6.2 内核网络调优

编辑 /etc/sysctl.conf

# 最大 TCP 缓冲区提升至 64MB
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

# TCP 自动调优缓冲区范围
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432

使配置生效:

sudo sysctl -p

6.3 服务端优化

在 NFS 服务端(各存储服务器)增加 nfsd 线程数,编辑 /etc/nfs.conf

[nfsd]
threads=128

重启服务:

sudo systemctl restart nfs-server

6.4 openEuler eNFS 特性(可选)

openEuler 提供了增强的 NFS 客户端 eNFS,支持多链路负载均衡,可显著提升性能和可靠性。当前版本负载均衡仅支持 NFSv3

配置文件 /etc/enfs/config.ini

path_detect_interval=10
path_detect_timeout=10
multipath_timeout=0
multipath_disable=0

使用 eNFS 挂载:

mount -t nfs -o vers=3,localaddrs=192.168.20.3,remoteaddrs=192.168.20.14 192.168.20.14:/bak /mnt/nfs14

第七部分:运维管理命令速查

7.1 查看存储池状态

# 查看合并总容量
df -h /bak

# 查看各分支独立容量
df -h /mnt/localbak /mnt/nfs14 /mnt/nfs19

# 查看当前 mergerfs 挂载选项
mount | grep mergerfs

# 查看控制接口信息(如果可用)
cat /bak/.mergerfs/ctl 2>/dev/null

7.2 管理 mergerfs 服务

# 启动服务
sudo systemctl start mergerfs-bak.service

# 停止服务
sudo systemctl stop mergerfs-bak.service

# 重启服务
sudo systemctl restart mergerfs-bak.service

# 查看服务状态
sudo systemctl status mergerfs-bak.service

# 查看服务日志
sudo journalctl -xeu mergerfs-bak.service -n 50

7.3 管理 NFS 挂载

# 查看所有 NFS 挂载
mount | grep nfs

# 手动挂载所有 fstab 条目
sudo mount -a

# 卸载 NFS 挂载
sudo umount /mnt/nfs14

# 查看服务端共享列表(客户端)
showmount -e 192.168.20.14

第八部分:故障排查

8.1 服务启动失败

# 查看详细错误
sudo systemctl status mergerfs-bak.service
sudo journalctl -xeu mergerfs-bak.service -n 50

常见原因及解决方案:

问题 解决方案
target is busy 使用 sudo fuser -km /bak 强制结束占用进程
unknown option 'control' mergerfs 版本不支持该选项,移除即可
分支路径不存在 检查 NFS 是否已正确挂载到 /mnt/nfs*
服务启动后立即退出 ExecStart 中添加 -f 选项强制前台运行

8.2 热添加失败

# 检查控制接口是否存在
ls -la /bak/.mergerfs

如果 /bak/.mergerfs 是普通文件而非目录,删除后重新挂载 mergerfs:

sudo rm -f /bak/.mergerfs
sudo umount /bak
sudo mergerfs -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak

8.3 NFS 挂载卡住

# 使用软挂载(intr 允许中断)
mount -t nfs -o intr,timeo=30 192.168.20.14:/bak /mnt/nfs14

# 检查服务端 NFS 服务状态
systemctl status nfs-server  # 在服务端执行

# 检查防火墙
sudo firewall-cmd --list-all  # 在服务端执行

附录:常用命令速查表

操作 命令
安装 NFS sudo dnf install -y nfs-utils
配置共享 sudo vi /etc/exports
生效共享配置 sudo exportfs -r
查看共享 showmount -e localhost
挂载 NFS sudo mount -t nfs IP:/dir /mountpoint
安装 mergerfs sudo dnf install -y ./mergerfs-*.rpm
合并存储池 sudo mergerfs -o ... branch1:branch2 /mountpoint
热添加分支 echo "add /new/branch" | sudo tee /mountpoint/.mergerfs/ctl
查看服务状态 sudo systemctl status mergerfs-bak.service
查看日志 sudo journalctl -xeu mergerfs-bak.service -n 50

文档版本:1.0 | 更新日期:2026-07-13 | 适用环境:openEuler 22.03

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐