Skip to content

第 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后端存储
GLUSTERGlusterFS
CEPHCephFS
VFS本地文件系统
PROXY代理到另一个 NFS 服务器
RGWCeph 对象网关

本书使用 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导出路径
PseudoNFSv4 使用的伪路径
Protocols支持的 NFS 协议版本
Access_Type访问类型:RW(读写)或 RO(只读)
Squashroot 用户映射策略
FSAL.Name使用的 FSAL 名称
FSAL.HostnameGlusterFS 连接地址
FSAL.VolumeGlusterFS 卷名

4.5 Ganesha 与 GlusterFS 的集成原理

Client ──► NFS-Ganesha ──► GLUSTER FSAL ──► libgfapi ──► GlusterFS Volume

NFS-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

练习题

  1. NFS-Ganesha 相比内核 NFS 有什么优势?
  2. 什么是 FSAL?本书使用哪种 FSAL?
  3. Ganesha 通过什么方式访问 GlusterFS?这种方式有什么好处?
  4. 解释 Export_IdPathPseudo 三个配置字段的区别。