两台服务器 NFS 共享目录实战:实现数据同步与故障转移兼容
在分布式部署(如 K8s 集群、多节点服务)场景中,经常需要解决 "跨服务器数据共享" 问题 ------ 例如 Pod 故障转移后需访问原路径数据、多节点读写同一配置文件 / 日志等。NFS(Network File System,网络文件系统)是 Linux 环境下轻量高效的解决方案,可通过网络将一台服务器的目录共享给其他节点,实现目录数据实时同步。本文将详细拆解两台服务器 NFS 共享目录的完整实现流程,包含环境配置、权限优化、挂载验证、开机自启等关键步骤,兼顾实用性与可落地性。
一、NFS 核心原理与应用场景
1. 核心原理
NFS 允许客户端将服务器端的共享目录挂载到本地文件系统,客户端对该目录的读写操作会通过网络实时同步到服务器端,相当于在本地操作远程目录。其核心优势在于:
- 轻量无依赖:基于 Linux 内核实现,无需额外部署复杂服务;
- 实时同步:客户端与服务器端数据实时一致,无延迟;
- 兼容性强:支持所有 Linux 发行版,可直接对接 K8s、Docker 等容器化环境。
2. 典型应用场景
- 容器故障转移:Pod 从 A 服务器迁移到 B 服务器后,仍可通过挂载的 NFS 目录访问原数据(如业务日志、配置文件、持久化存储);
- 多节点数据共享:多台服务器需读写同一批文件(如静态资源、共享配置),避免重复存储;
- 数据备份:多节点数据集中存储在 NFS 服务器,便于统一备份与管理。
二、环境准备
1. 服务器规划
| 节点角色 | 服务器 IP | 操作系统 | 共享 / 挂载目录 | 核心作用 |
|---|---|---|---|---|
| NFS 服务器(主节点) | 192.168.3.122 | CentOS 7.8 | /nfs/data(共享目录) | 提供目录存储,接收客户端读写请求 |
| NFS 客户端(从节点) | 192.168.3.123 | CentOS 7.8 | /bak/data(挂载目录) | 挂载服务器共享目录,本地读写同步到服务器 |
2. 依赖安装(所有节点执行)
NFS 依赖nfs-utils(NFS 核心工具)和rpcbind(远程过程调用服务,负责端口映射),需在服务器和客户端同时安装:
# CentOS/RHEL 系列(yum包管理器)
yum install -y nfs-utils rpcbind
# 若为Ubuntu/Debian 系列(apt包管理器),替换为:
apt-get update && apt-get install -y nfs-common nfs-kernel-server rpcbind
3. 防火墙与 SELinux 配置(关键!避免访问失败)
NFS 默认使用 111 端口(rpcbind)和动态端口(1024-65535),需开放防火墙规则,同时临时关闭 SELinux(或配置例外):
(1)防火墙配置(所有节点)
# 开放nfs和rpcbind相关端口
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpcbind
firewall-cmd --permanent --add-service=mountd # NFS挂载依赖服务
firewall-cmd --reload # 重载防火墙规则生效
(2)SELinux 配置(所有节点)
SELinux 可能会限制 NFS 的目录访问权限,建议临时关闭:
# 临时关闭SELinux
setenforce 0 #重启后失效,适合测试/快速部署
# 查看SELinux状态
getenforce #返回Permissive即为关闭
# 若需永久关闭(编辑配置文件):
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 重启服务器生效
三、NFS 服务器(主节点)配置
1. 创建共享目录
在服务器端创建用于共享的本地目录,后续客户端将挂载该目录:
# 创建共享目录
mkdir -p /nfs/data
# 设置目录权限(关键!确保客户端有读写权限)
chmod -R 755 /nfs/data
chown -R nobody:nobody /nfs/data # 映射为匿名用户,避免权限冲突
2. 配置 NFS 共享规则
编辑 NFS 核心配置文件/etc/exports,定义共享目录、允许访问的客户端及权限:
# 编辑配置文件
vi /etc/exports
# 添加以下内容(核心规则)
/data/nfs 192.168.3.0/24(insecure,rw,sync,no\_root\_squash,no\_subtree\_check)
3. 启动 NFS 服务并生效配置
# 启动rpcbind服务(NFS依赖,需先启动)
systemctl enable rpcbind --now # enable设置开机自启,--now立即启动
# 启动nfs-server服务
systemctl enable nfs-server --now
# 使共享配置生效(修改/etc/exports后无需重启服务,执行此命令即可)
exportfs -r
验证服务器配置是否正常
# 查看NFS服务器共享的目录列表
showmount -e localhost
若输出以下内容,说明服务器配置成功:
Export list for localhost:
/nfs/data 192.168.3.0/24
四、NFS 客户端(从节点)配置
1. 验证服务器共享目录
先在客户端测试是否能访问服务器的 NFS 共享目录,确保网络通畅:
# 查看NFS服务器(192.168.3.122)的共享目录
showmount -e 192.168.3.122
若输出与服务器端showmount -e localhost一致,说明网络和服务器配置无问题。
2. 创建本地挂载目录
在客户端创建用于挂载服务器共享目录的本地目录(自定义路径,如 /bak/data,与业务需求一致):
mkdir -p /bak/data # 目录路径可自定义,如/data/nfs-mount
3. 挂载 NFS 共享目录
将服务器的/nfs/data目录挂载到客户端的/bak/data目录:
# 执行挂载命令(-t nfs指定文件系统类型为NFS)
mount -t nfs 192.168.3.122:/nfs/data /bak/data
4. 验证挂载是否成功
(1)查看挂载状态
# 方式1:查看所有挂载点,过滤nfs
mount | grep nfs
# 方式2:查看NFS相关挂载(更简洁)
df -h | grep nfs
若输出以下类似内容,说明挂载成功:
192.168.3.122:/nfs/data 100G 5.8G 95G 6% /bak/data
(2)数据同步测试
通过读写文件测试客户端与服务器端数据是否同步:
# 客户端在挂载目录创建测试文件
echo "123" > /bak/data/test.txt
# 服务器端查看共享目录是否存在该文件
cat /nfs/data/test.txt # 输出:123
# 服务器端修改文件,客户端验证
echo "321" >> /nfs/data/test.txt
cat /bak/data/test.txt # 输出两行内容,说明双向同步成功
五、部署过程遇到的问题(避坑)
1. 客户端执行 showmount -e 服务器 IP 报错 "clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)"
-
原因:服务器防火墙未开放 NFS 相关端口,或网络不通;
-
解决:重新执行服务器防火墙开放命令(
firewall-cmd --permanent --add-service=nfs --add-service=rpcbind --add-service=mountd && firewall-cmd --reload),并测试服务器与客户端网络(ping ``192.168.3.122)。
2. 客户端挂载时报错 "mount.nfs: access denied by server while mounting 192.168.3.122:/nfs/data"
-
原因:服务器
/etc/exports中允许的客户端网段不包含当前客户端 IP,或权限参数配置错误; -
解决:修改服务器
/etc/exports,将客户端 IP 加入允许网段(如192.168.3.123),执行exportfs -r生效。