主题
第 4 章 NFS-Ganesha 入门
4.1 为什么需要 NFS-Ganesha
在构建高可用 NFS 存储时,我们面临一个核心问题:
如何让多台服务器同时提供 NFS 服务,并且看到同一份数据?
如果使用内核 NFS(nfs-kernel-server),每台服务器导出的是自己本地的文件系统。要让多台服务器看到同一份数据,通常需要共享存储(SAN/iSCSI),成本高且架构复杂。
NFS-Ganesha 通过 FSAL(File System Abstraction Layer) 解决了这个问题:
┌─────────┐ ┌─────────────┐ ┌─────────────────┐
│ Client │────►│ NFS-Ganesha │────►│ FSAL → GlusterFS│
└─────────┘ └─────────────┘ └─────────────────┘NFS-Ganesha 可以直接作为 GlusterFS 的客户端,将 GlusterFS volume 导出为 NFS 协议,多台 Ganesha 服务器可以同时导出同一个 volume。
4.2 NFS-Ganesha 架构与 FSAL
NFS-Ganesha 核心组件
| 组件 | 说明 |
|---|---|
| NFS 协议层 | 处理 NFSv3/v4/pNFS 请求 |
| Cache Layer | 元数据和数据缓存 |
| FSAL | 文件系统抽象层,对接不同后端 |
| D-Bus 接口 | 运行时管理接口 |
| 日志系统 | 丰富的日志配置 |
FSAL 类型
NFS-Ganesha 支持多种 FSAL:
| FSAL | 后端存储 |
|---|---|
| GLUSTER | GlusterFS |
| CEPH | CephFS |
| VFS | 本地文件系统 |
| PROXY | 代理到另一个 NFS 服务器 |
| RGW | Ceph 对象网关 |
本书使用 GLUSTER FSAL。
4.3 Ganesha 支持的导出后端
NFS-Ganesha 不仅可以导出 GlusterFS,还可以导出:
- 本地 ext4/xfs 文件系统
- CephFS
- 其他 NFS 服务器(代理模式)
- 对象存储
这种灵活性使得 NFS-Ganesha 成为构建统一 NFS 网关的理想选择。
4.4 Ganesha 配置文件结构
Ganesha 的主配置文件通常是 /etc/ganesha/ganesha.conf。
基本配置块
conf
EXPORT {
Export_Id = 1;
Path = "/gv0";
Pseudo = "/gv0";
Protocols = 3, 4;
Access_Type = RW;
Squash = No_Root_Squash;
FSAL {
Name = GLUSTER;
Hostname = "localhost";
Volume = "gv0";
}
}
LOG {
Default_Log_Level = INFO;
}关键字段说明
| 字段 | 说明 |
|---|---|
Export_Id | 导出的唯一标识 |
Path | 导出路径 |
Pseudo | NFSv4 使用的伪路径 |
Protocols | 支持的 NFS 协议版本 |
Access_Type | 访问类型:RW(读写)或 RO(只读) |
Squash | root 用户映射策略 |
FSAL.Name | 使用的 FSAL 名称 |
FSAL.Hostname | GlusterFS 连接地址 |
FSAL.Volume | GlusterFS 卷名 |
4.5 Ganesha 与 GlusterFS 的集成原理
Client ──► NFS-Ganesha ──► GLUSTER FSAL ──► libgfapi ──► GlusterFS VolumeNFS-Ganesha 通过 libgfapi 直接访问 GlusterFS,而不是通过内核 FUSE 挂载。这种方式:
- 避免了 FUSE 的性能开销
- 每台 Ganesha 服务器独立访问 GlusterFS
- 任意 Ganesha 节点故障,其他节点继续服务
在多节点部署中,每台服务器运行一个 Ganesha 实例,它们都通过本地 libgfapi 访问同一个 GlusterFS volume:
┌─────────────────┐
│ Client │
│ mount VIP │
└────────┬────────┘
│
┌────────┴────────┐
│ Keepalived │
│ VIP 漂移 │
└────────┬────────┘
│
┌────────────┼────────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│Ganesha│ │Ganesha│ │Ganesha│
│Node1 │ │Node2 │ │Node3 │
└───┬───┘ └───┬───┘ └───┬───┘
│ │ │
└───────────┼───────────┘
│
┌───────▼────────┐
│ GlusterFS gv0 │
│ Replica 3 │
└────────────────┘4.6 本章小结
- NFS-Ganesha 是用户态 NFS 服务器,适合多节点高可用
- FSAL 使 Ganesha 可以导出多种后端存储
- GLUSTER FSAL 通过 libgfapi 直接访问 GlusterFS
- 配置文件使用 EXPORT 块定义导出
- 多台 Ganesha 可独立导出同一个 GlusterFS volume
练习题
- NFS-Ganesha 相比内核 NFS 有什么优势?
- 什么是 FSAL?本书使用哪种 FSAL?
- Ganesha 通过什么方式访问 GlusterFS?这种方式有什么好处?
- 解释
Export_Id、Path、Pseudo三个配置字段的区别。