上篇文章 NFS+CephFS构建基于Ceph的NAS服务【1】中,我们介绍了基于ceph的文件接口通过ganesha导出NFS,该方法依赖cephFS中的mds组件。
本文将介绍基于ceph的对象接口rgw,通过ganesha导出NFS的方式,并与文件接口方式的NFS进行性能对比及分析。
0、 ceph集群环境准备
本文介绍的方法,ceph集群只需要部署mon和osd组件,即可使用对象接口导出NFS。由于ceph的Jewel版本默认是10.2.2版本,而该版本的对象存储存在一个BUG,即RGWZoneParams::create(): error creating default zone params: (17) File Exists错误,而下一个10.2.3版本修复了该问题,因此,本文通过源码编译的方式安装了ceph的10.2.3版本。
1、 编译和安装ganesha-rgw
在ceph集群中的任一节点上安装ganesha,执行如下命令:
cd ~; git clone https://github.com/nfs-ganesha/nfs-ganesha.git
cd nfs-ganesha; git checkout V2.4-stable;
git submodule update --init –recursive
cd src; mkdir build; cd build
cmake -DUSE_FSAL_RGW=ON ../
make; make install
如果需要通过源码生成rpm包,需要在nfs-ganesha/src/nfs-ganesha.spec文件中增加打包过程中将rgw.conf加入到rpm包中,然后使用rpmbuild生成nfs-ganesha-2.4.2-0.el7.centos.x86_64.rpm、nfs-ganesha-rgw-2.4.2-0.el7.centos.x86_64.rpm包。
%if %{with ceph}
install -m 644 config_samples/ceph.conf %{buildroot}%{_sysconfdir}/ganesha
%endif
###增加如下内容####
%if %{with rgw}
install -m 644 config_samples/rgw.conf %{buildroot}%{_sysconfdir}/ganesha
%endif
再运行一下命令:
rpmbuild -bb nfs-ganesha.spec --with=rgw
安装完成后,将增加在ganesha.nfsd命令,/usr/lib64/ganesha目录下增加libfsalrgw.so的动态链接库。
2、 设置并启动ganesha-rgw
在该节点中安装ceph-radosgw软件包,同时创建好如下的pool:
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.uid
default.rgw.users.email
default.rgw.users.keys
default.rgw.meta
default.rgw.usage
default.rgw.buckets.index
default.rgw.buckets.data
然后执行如下命令创建rgw用户:
radosgw-admin user create --uid=bocloud --display-name="bocloud test rgw" --email=liuyangkuan@beyondcent.com
以下是输出:
{
"user_id": "bocloud",
"display_name": "bocloud test rgw",
"email": "liuyangkuan@beyondcent.com",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "bocloud",
"access_key": "ACCESS_KEY",
"secret_key": "SECRET_KEY"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
},
"temp_url_keys": []
}
创建并编辑/etc/ganesha/rgw.conf文件,内容如下:
EXPORT
{
Export_ID=1;
Path = "/";
Pseudo = "/";
Access_Type = RW;
Protocols = 3,4;
Squash = No_Root_Squash;
Transport_Protocols = TCP;
FSAL {
Name = RGW;
User_Id = "bocloud";
Access_Key_Id = "ACCESS_KEY";
Secret_Access_Key = "SECRET_KEY";
}
}
RGW {
ceph_conf = "/etc/ceph/ceph.conf";
}
最后在/var/lib/ceph/radosgw/-admin/目录下创建名字为keyring文件,其内容为/etc/ceph/ceph.client.admin.keyring中的内容。
最后执行命令:
systemctl stop firewalld
systemctl start rpcbind
systemctl start rpc-statd
ganesha.nfsd -f /etc/ganesha/ceph.conf -L /var/log/ganesha.log -N NIV_INFO
那么基于ceph-rgw对象接口的NFS就启动了。showmount -e命令能够显示导出的文件系统。需要说明的是,使用nfs客户端挂载该NFS时,需要先创建一个目录,然后在该目录下创建文件或目录,因为第一层的目录相当于对象存储中的bucket。
3、 NFS over RGW与NFS over CephFS的性能对比
本次性能测试,集采用了三台配置相同的物理机,配置如下:
文件接口中涉及的data和metadata pool以及对象接口中的default.rgw.buckets.data和default.rgw.buckets.index采用的3副本,pg_num和pgp_num为128使用了一台千兆网口的物理机做NFS客户端,使用的NFSv4协议。
3.1 使用dd工具大粒度(1M)顺序读写测试
3.2 使用fio工具小粒度(4K)随机读写测试
3.3 性能分析
由以上测试结果发现,对于MB级别的大粒度IO,CephFS的性能较优,尤其是读性能,已经达到NFS客户端的网络带宽极限。而对于百万级别小文件的小粒度随机IO,RGW的性能更优,对象存储也是专为百万级别的小文件或对象而设计的。由于RGW仅实现了几个基本的POXIS语义中的接口,且文件和目录都以对象形式扁平化地存储在bucket中,因此相比完全实现POXIS语义的CephFS来说,小对象的性能表现更优。
4、 参考文献
【1】NFS+CephFS构建基于Ceph的NAS服务http://mp.weixin.qq.com/s/yLMSs57SH3
_x3bKvWLSAVw
【2】NFS-ganesha WiKi https://github.com/nfs-ganesha/nfs-ganesha/wiki