上篇文章 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

 
                   
                   
         
             
            