CephFS 本身不原生支持 NFS 共享,必须通过 NFS-Ganesha 中间层导出;高并发下瓶颈在 MDS,单活跃 MDS 是默认且推荐策略,不能靠增加 MDS 数量提升并发能力。

直接说结论:CephFS 本身不原生支持 NFS 共享,必须通过 NFS-Ganesha 中间层导出;高并发下 MDS 成为瓶颈,单活跃 MDS 是默认且推荐策略,不能靠“加 MDS 数量”提升并发能力。
创建 CephFS 文件系统:必须显式指定 metadata/data pool
从 Octopus(v15.2.0+)开始,ceph fs volume create 命令会自动创建池和 MDS,但生产环境强烈建议手动控制池参数。常见错误是跳过池创建,直接执行 ceph fs new 导致报错 pool 'xxx' does not exist。
实操步骤:
- 先创建两个独立 pool:
ceph osd pool create cephfs_metadata 128(元数据池,PG 数建议 ≥128)、ceph osd pool create cephfs_data 256(数据池,PG 数按 OSD 数 × 100 / 副本数向上取最接近的 2 的幂) - 再绑定创建文件系统:
ceph fs new cephfs cephfs_metadata cephfs_data - 检查状态:
ceph fs ls应显示name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data];ceph mds stat应为cephfs:1 {0=cephfs-a=up:active}
NFS-Ganesha 部署:版本与依赖必须严格匹配
不是所有 NFS-Ganesha 都能对接 CephFS。关键限制是:nfs-ganesha-ceph FSAL 模块仅在 Ganesha ≥ 2.5 且编译时启用 -DUSE_FSAL_CEPH=ON 才可用。用 yum/dnf 安装的默认包常不含该模块,导致启动后日志反复报 FSAL_CEPH not found 或 ceph_fsal_init failed。
安全做法:
- 确认 Ceph 版本(如 Pacific v16.x)→ 查对应 Ganesha 兼容表(官方文档明确标注 v16.x 推荐 Ganesha v3.5+)
- 用源码编译安装(非包管理器):
cmake -DUSE_FSAL_CEPH=ON -DCMAKE_INSTALL_PREFIX=/usr ..,避免依赖冲突 - 安装后验证:
ganesha.nfsd -V | grep ceph应输出含ceph的 FSAL 列表
导出 CephFS 为 NFS:配置里必须写死 MDS 主节点地址
NFS-Ganesha 不会自动发现 CephFS 的 MDS 状态,它只连接一个固定 MDS。如果配置中用 ceph:// 而不指定 host,Ganesha 会尝试连接本地回环,失败后静默降级为只读或挂起请求,现象是客户端 showmount 可见共享但 mount 卡住或超时。
正确配置片段(/etc/ganesha/ganesha.conf):
EXPORT
{
Export_Id = 101;
Path = "/";
Pseudo = "/cephfs";
Access_Type = RW;
Squash = No_Root_Squash;
FSAL {
Name = CEPH;
User_Id = "admin";
Secret_Access_Key = "AQD...=="; # 从 ceph auth get-key client.admin 获取
Ceph_Conf = "/etc/ceph/ceph.conf";
Ceph_Id = "admin";
# 关键:强制指定活跃 MDS 地址,避免 DNS 解析失败
Ceph_Mon_Addr = "192.168.10.25:6789,192.168.10.26:6789,192.168.10.27:6789";
}
}注意:Ceph_Mon_Addr 是 MON 地址列表(非 MDS),Ganesha 通过 MON 获取当前 active MDS 位置;但若网络策略禁止访问 MON 端口(6789),需改用 Ceph_Mds_Addr 直连 MDS(格式:IP:6800)。
高并发 NFS 共享:瓶颈不在 NFS 层,而在 MDS 内存与元数据热点
测试中常见误区:增加 NFS-Ganesha 实例数或调大 Threads 参数,对吞吐无明显提升,因为所有请求最终串行打到同一个 active MDS 上。真正影响并发的是 MDS 的内存占用(元数据缓存)和目录层级深度。
关键调优点:
- MDS 内存上限必须设够:
ceph daemon mds.cephfs-a config set mds_cache_memory_limit 8589934592(8GB),否则频繁刷缓存导致延迟飙升 - 避免单目录下超 10 万文件:MDS 对 deep directory listing 性能极差,应按业务分片(如按用户 ID 哈希分目录)
- NFS 客户端挂载加选项:
nolock,hard,intr,rsize=1048576,wsize=1048576,禁用 NFS 锁(CephFS 不支持)并启用大块传输
最后提醒:NFS-Ganesha 日志(/var/log/ganesha.log)里出现 CEPH: error from libcephfs: Permission denied,大概率是 client.admin keyring 权限不足,需确认该用户有 allow rw fsname=cephfs 的 caps。这点容易被忽略,但会导致整个共享不可用。
















