主题
第 2 章 NFS 协议基础
2.1 NFS 协议发展历史
NFS(Network File System,网络文件系统)由 Sun Microsystems 于 1984 年提出,是目前最主流的网络文件共享协议之一。
| 版本 | 发布时间 | 主要特性 |
|---|---|---|
| NFSv2 | 1989 | 第一个广泛使用的版本,使用 UDP |
| NFSv3 | 1995 | 支持大文件、异步写入、TCP/UDP |
| NFSv4 | 2000 | 集成锁、状态化、单端口 2049、更好安全性 |
| NFSv4.1 | 2010 | 支持 pNFS(并行 NFS),提升扩展性 |
| NFSv4.2 | 2016 | 增加服务器端复制、应用保留属性等 |
本书主要使用 NFSv4.1,它在兼容性和性能之间取得了良好平衡。
2.2 NFS 工作原理与 RPC 机制
NFS 本身并不直接传输数据,而是基于 RPC(Remote Procedure Call,远程过程调用) 实现的。
基本流程
Client Server
│ │
│ 1. mount 请求 │
│ ─────────────────────► │
│ │
│ 2. 返回文件句柄 │
│ ◄───────────────────── │
│ │
│ 3. read/write 请求 │
│ ─────────────────────► │
│ │
│ 4. 返回数据/状态 │
│ ◄───────────────────── │NFSv3 与 RPC 服务
NFSv3 依赖多个 RPC 服务:
rpcbind:端口映射mountd:处理挂载请求nfsd:处理文件 IOlockd/statd:文件锁管理
NFSv4 改进
NFSv4 将大部分功能整合到单一端口 2049,不再需要单独的 mountd、lockd、statd,更易于防火墙管理和集群部署。
2.3 NFS 挂载选项详解
Linux 客户端通过 mount 命令挂载 NFS:
bash
mount -t nfs -o options server:/path /local/path常用选项
| 选项 | 说明 |
|---|---|
vers=4.1 | 使用 NFSv4.1 |
hard | 硬挂载,服务器不可用时客户端会不断重试 |
soft | 软挂载,超时后返回错误 |
intr | 允许中断硬挂载等待 |
timeo=600 | 超时时间(单位 0.1 秒) |
retrans=3 | 超时重试次数 |
nolock | 不使用文件锁 |
noatime | 不更新访问时间,提升性能 |
_netdev | 声明为网络文件系统,网络就绪后再挂载 |
推荐挂载参数
对于生产环境,推荐使用:
bash
mount -t nfs -o vers=4.1,hard,intr,timeo=600,retrans=3,_netdev server:/path /mnt/nfs写入 /etc/fstab:
server:/path /mnt/nfs nfs4 defaults,_netdev,hard,intr,timeo=600,retrans=3 0 02.4 NFS 的高可用挑战
传统 NFS 服务由单台服务器提供,存在以下问题:
- 服务器单点故障:NFS 服务器宕机,所有客户端无法访问
- IP 固定:客户端配置的是具体服务器 IP,故障后需要手动切换
- 状态保持:NFSv4 是有状态协议,故障切换后需要重新建立状态
- 数据一致性:多节点同时服务时,需要保证数据一致
解决方案
| 问题 | 解决方案 |
|---|---|
| 服务器单点故障 | 多节点 + 数据冗余 |
| IP 固定 | Keepalived VIP 漂移 |
| 状态保持 | NFS-Ganesha 用户态实现 + 后端共享存储 |
| 数据一致性 | GlusterFS 复制卷 + 仲裁机制 |
2.5 内核 NFS 与用户态 NFS(NFS-Ganesha)
内核 NFS
Linux 内核自带的 NFS 服务(nfs-kernel-server):
- 性能高
- 与内核集成紧密
- 但扩展性和灵活性较差
- 多节点高可用配置复杂
NFS-Ganesha
NFS-Ganesha 是一个用户态 NFS 服务器,支持 NFSv3/v4/pNFS,可通过多种 FSAL(File System Abstraction Layer)导出不同后端存储。
Client ──► NFS-Ganesha ──► FSAL ──► 后端存储
│
├──► GLUSTER (GlusterFS)
├──► CEPH (CephFS)
├──► VFS (本地文件系统)
└──► ...NFS-Ganesha 的优势:
- 可在多个节点独立运行
- 通过 FSAL 直接访问 GlusterFS,无需内核挂载
- 配置灵活,适合高可用架构
- 支持 NFSv4 高级特性
2.6 本章小结
- NFS 是主流网络文件共享协议,本书使用 NFSv4.1
- NFS 基于 RPC 工作,NFSv4 简化了端口依赖
- 挂载参数对性能和稳定性影响很大
- 传统 NFS 存在单点故障问题
- NFS-Ganesha 是用户态 NFS 服务器,适合多节点高可用场景
练习题
- NFSv4 相比 NFSv3 有哪些主要改进?
- 解释
hard和soft挂载的区别,生产环境为什么推荐hard? - NFS-Ganesha 中的 FSAL 是什么作用?
- 为什么传统内核 NFS 不适合直接做多节点高可用?