本文介绍了两种基于CephFS构建NAS的解决方案,并从架构、IO栈与性能方面比较和分析了各自特点,为读者提供参考。
1
Ceph介绍
Ceph是统一分布式存储系统,具有优异的性能、可靠性、可扩展性。Ceph的底层是RADOS(可靠、自动、分布式对象存储),可以通过LIBRADOS直接访问到RADOS的对象存储系统。Ceph还提供三种标准的访问接口:RBD(块设备接口)、RADOS Gateway(对象存储接口)、Ceph File System(POSIX文件接口)。
对于CephFS主要由三个组件构成:MON、OSD和MDS。
Ceph系统架构图
2
NFS协议及NAS介绍
NFS是Network File System的简写,即网络文件系统,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,而NFS客户端和NFS服务器之间正是通过NFS协议进行通信的。
目前NFS协议版本有NFSv3、NFSv4和NFSv4.1,NFSv3是无状态的,NFSv4是有状态,NFSv3和NFSv4是基于Filelayout驱动的,而NFSv4.1是基于Blocklayout驱动。本文主要使用NFSv4协议。
NAS(Network Attached Storage)网络存储基于标准网络协议NFSv3/NFSv4实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。
NAS示意图
目前市场上的NAS存储是专门的设备,成本较高,且容量不易动态扩展,数据高可用需要底层RAID来保障。
下面将介绍基于CephFS的NAS解决方案,在 成 本、容量扩展性与高可用方面,较传统NAS有优势。
3
CephFS的部署
首先介绍部署CephFS的过程,为了展示功能及原理,本文使用linux-fedora24虚拟机建立单点的ceph(V10.2.2)环境,使用一个OSD存储、一个MON和一个MDS。
首先安装ceph-deploy(v1.5.31)工具和CephFS组件,并创建部署集群目录。
由于本文只使用1个OSD,因此修改ceph.conf文件,增加以下两行:
接下来创建mon、osd、mds:
至此,CephFS集群就搭建好了,查看集群状态ceph -s后的输出如下:
4
两种导出CephFS作为nfs-server的方法
Ceph集群提供了ceph-fuse客户端访问CephFS,用户先在平台上安装ceph-fuse软件包,然后拷贝集群的ceph.client.admin.keyring到本机的/etc/ceph目录下,然后执行:
这样,用户就能访问CephFS中的文件。但是由于一些平台的软件环境以及依赖库的限制,无法安装ceph-fuse客户端软件,而无法访问CephFS。下面将提供其他两种访问CephFS的方案。
方案一
ceph-fuse 和 nfsd
首先需要通过ceph-fuse将CephFS挂载到拟作为NFS服务器的主机目录上,然后在/etc/exports中添加如下内容:
*注意:此处XXX为ceph集群的id:dfbfb593-9f18-46be-8274-00604cec6c76
然后运行exportfs命令,再启动rpcbind和nfs-server服务,那么该节点已成为NFS服务器,NFS客户端可以通过mount -t nfs4 –o rw, notime NFS-server:/ PATH/TO/mount /Local/PATH命令将NFS挂载到本地,从而实现访问CephFS。
方案二
NFS-Ganesha
NFS-Ganesha 是一个基于 NFSv3v4v4.1 的NFS服务器,运行在大多数 Linux 发行版的用户态空间下,同时也支持 9p.2000L 协议。Ganesha通过利用libcephfs库支持CephFS FSAL(File System Abstraction Layer,文件系统抽象层),可以将CephFS重新Export出去。
在ceph集群的MON节点上,如果无法通过yum install nfs-ganesha-fsal-ceph命令安装软件包,那么需要通过编译源码安装。
安装完nfs-ganesha软件包后,先关闭防火墙或者开通2049端口为例外,并启动rpcbind和rpc-statd服务。
创建文件/etc/ganashe/ceph.conf,内容如下:
最后,执行如下命名启动ganesha nfs守护进程,然后可以用showmount命令来验证导出的NFS共享文件系统。
这样,我们就把ceph的MON节点也配置成了NFS-ganesha服务器。同样,在NFS客户机上运行mount -t nfs4 –o rw, notime MON-IP:/ /Local/PATH,那么用户将可以通过NFS协议访问CephFS。
5
架构与IO路径比较
以上两种方式虽然都可以通过NFS协议访问CephFS,为用户提供文件服务,但是两者在 IO路径和 系统架构层次上存在较大差异。
方案一中,通过ceph-fuse客户端,将CephFS挂载到ceph-fuse客户端的本地,然后通过NFSD的内核模块导出成为NFS服务器。NFS客户端访问服务器时,NFSD需要通过VFS访问挂载在ceph-fuse客户端主机上的FUSE文件系统,然后通过ceph-fuse模块同CephFS集群打交道,向CephFS读取或写入数据。因此,数据访问的IO流是先从内核态的RPC经NFSD模块解析后,调用VFS的数据访问接口,而该接口将通过用户态的libfuse调用ceph-fuse的具体函数。然后ceph-fuse再与CephFS集群的MON通信,确定MDS的地址和元数据信息,最后从OSD中读写数据并将结果返回给远程客户端。
方案一涉及的模块层次和IO路径
方案二中,用户态的nfs-ganesha直接把CephFS导出作为NFS服务器,省去了在NFS服务器上通过ceph-fuse挂载CephFS的过程。因此NFS客户端读数据的IO流为:内核态的RPC模块先接收到NFS客户端的数据访问请求,经过解析,调用运行在用户态ganesha.nfsd模块中对文件系统抽象层中的数据访问接口,最后通过libcephfs访问CephFS集群。在这里libfsalceph库处理文件的读写、目录的处理和ceph-fuse的功能是一致的,但本方案并不需要通过FUSE和NFS服务器中的VFS内核打交道。
方案二涉及的模块层次和IO路径
6
性能比较
为了比较两种方案在数据IO性能方面的差异,我们首先在CephFS中写入一个100MB的大文件和拷贝ceph源码目录,然后分别通过两种方式,从NFS客户端访问该大文件和tree命令列出目录树结构,以下是测试结果:
对于元数据操作较多的列出目录树结构操作,方案二的性能比方案一好50%左右,这是因为该测试中每一个目录查找都需要通过VFS中FUSE调用,需要从内核态的VFS到用户态的ceph-fuse,IO调用路径比ganesha直接调用libcephfs做目录查找要长,因此时间开销更多。而读取100MB大文件,方案一略优于方案二,主要是因为通过ceph-fuse在NFS服务器端构建了文件系统,因此在读文件时,NFS服务器会以默认128KB的长度预读数据,可以加速大文件的读性能。
7
总结
当平台不支持ceph-fuse而又需要访问Cephfs的时候,可以将CephFS通过本文介绍的两种方式配置成NAS,这样,在该平台上就可以通过NFS协议访问CephFS。而ganesha方案相比ceph-fuse+NFSD方案在元数据操作较多的场景下性能方面有优势,但需要在MON节点上安装nfs-ganesha-fsal-ceph软件包及其依赖包。而ceph-fuse+NFSD方案在软件包的安装方面会更便捷。
参考文献
- Ceph Cookbook中文版,Karan Singh,P96-P98
- 存储技术原理分析,敖青云,P40-P45