openEuler 22.03 NFS + mergerfs 分布式存储池部署完整文档
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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)