@tony-yin
2018-04-25T02:20:30.000000Z
字数 5311
阅读 1974
Ceph NFS
自从Jewel版本,nfs-ganesha开始支持ceph,并且把对接点选择了rados。Ganesha支持两种方式将Ceph导出为NFS,一种通过RGW,一种通过CephFS,通过FSAL模块 连接到RGW或者CephFS, 其中,FSAL_RGW调用librgw2将NFS协议转义为S3协议再通过RGW存入到Ceph中,FSAL_CEPH 调用libcephfs1将NFS转义为Cephfs协议再存入到Ceph 中。所以需要额外安装这两个包。
本文就Luminous版本的ceph基于ganesha导出nfs部署,并且测试一下rgw和cephfs的性能。@徐小胖已经就jewel版本的过程进行了大致的讲解,我这边主要分享一下我遇到他文章没提到的和Luminous场景导致的问题。
一些编译需要的公共库
yum install gcc git cmake autoconf libtool bison flex doxygen openssl-devel gcc-c++ krb5-libs krb5-devel libuuid-devel nfs-utils -y
ubuntu的我也试了一下,主要有以下几个包不同:
gcc-c++ -> g++libuuid-devel -> uuid-devnfs-utils -> nfs-kernel-server 如果要生成FSAL_RGW模块,需要安装librgw2-devel(我装的librgw-devel也可以work,看了so文件发现就是2,只是建立了映射关系,这个看了源码知道了是因为K版本对librgw编译这块做了升级,加了2标识一下)
yum install librgw2-devel -y
如果要生成FSAL_CEPH模块,需要安装libcephfs1-devel
yum install libcephfs1-devel -y
上面两篇文章一个下载的是v2.3 stable,一个是v2.4 stable,两个我都试过,都会在make到80%左右的时候报错,应该是源码版本和库的版本有冲突导致的,这个问题耽误我挺长时间的,后来猜想可能是版本问题,尝试了一下v2.5 stable的源码就可以了
git clone -b V2.5-stable https://github.com/nfs-ganesha/nfs-ganesha.git --recursive
注意:(重要)
最近我同事根据这篇文档部署nfs-ganesha的时候,发现之后cmake的操作后USE_FSAL_RGW始终是OFF的状态,一开始检查了一下环境发现ganesha是v2.5,然后ceph也是L版本,centos也是7。
报错如下:
local RGW version is 1.1.4 not suitable match, but required latest RGW version is 1.1.6
很好理解,就是我们安装的RGW达不到nfs-ganesha的要求,首先我们尝试去安装新的版本,但是yum的源已经配置了luminous,并且网上搜索了一圈并没有找到更新的。
ok,那就第二步,那就找原因同样的环境为啥我可以成功?而这位同事却不行?莫非因为我帅?不能这么逆天吧^_^ (明明可以靠脸吃饭,偏偏靠才华,哎……)
言归正传,通过报错信息查看源代码?定位到了报错文件src/CMakeLists.txt,然后代码中对RGW的版本要求也的确是1.1.6,回过头再看我之前下载下来的源代码,怪异的现象发生了,我代码中对RGW的版本要求只有1.1.3,此时我的第一反应就是应该这个文件被修改过导致两份代码不一样,出于本能直接上了github,果不其然,发现了mattbenjamin同学在10月17号在v2.5的分支上提交了一个commit针对RGW版本做出了修改!具体参看commit详情,而这位贡献者几乎同时也在ceph提交了相关代码。这样想想就说得通了,我在搭建nfs-ganesha的时候恰好是在他提交之前的,所以我本地RGW本地版本是1.1.4是比要求版本1.1.3要高的,虽然不是完全match,但是也基本符合了要求,而我这位同事脸就比较黑了。。。
那该怎么解决这个问题呢?
有两种解决方案:
Luminous Ceph把最新的RGW包编译出来,因为现在这个资源还没被公开分享出来;这么看来第二种更为简单一些,我们也是采用的这种方式,git clone v2.5 stable后,然后git checkout恰当的版本号即可。
总结:
其实直接clone实时的代码这是不合理的,因为你不知道他什么时候会更新。正确的方式是我们应该找到稳定的release版本,nfs-ganesha也有提供一系列的release,而我们通过查看2.5 tree上面的commit信息,可以知道RGW的改动是介于2.5.3和2.5.4之间的,所以我们下载2.5.3较为合适,下载地址在这里。
这边还需要注意一个问题,这边release包下载下来你会发现libntrirpc这个文件夹没有内容,出现这个问题是因为libntrirpc对应的也是一个git仓库,我们需要去ntrirpc手动克隆,然后通过nfs-ganesha的目录发现对ntrirpc的版本要求是fadcbde(这些都是上github可以看到的),我们需要做的就是在下载下来的ntrirpc目录下切到fadcbde这个commit上,并把当前的内容拷贝到nfs-ganesha的libntrirpc目录下。
实在搞不定的童鞋,我提供一个我克隆的nfs-ganesha的代码包,你们可以对比一下,这个我是可以成功部署的
附:我的nfs-ganesha下载地址
编译nfs-ganesha, 注意打开对应的模块:
FSAL_RGW模块,则在编译选项中添加: -DUSE_FSAL_RGW=ONFSAL_CEPH模块,则在编译选项中添加: -DUSE_FSAL_CEPH=ON
cd src/mkdir buildcd /build/cmake -DUSE_FSAL_RGW=ON -DUSE_FSAL_CEPH=ON ../
cmake的过程中会有以下输出:
-- Looking for ceph_ll_lookup_root in cephfs - found-- Found cephfs libraries: /usr/lib64/libcephfs.so-- Found CEPHFS: /usr/include-- Looking for rgw_mount in rgw-- Looking for rgw_mount in rgw - found-- Found rgw libraries: /usr/lib64/librgw.so-- Found RGW: /usr (found suitable version "1.1", minimum required is "1.1")...-- USE_FSAL_CEPH = ON-- USE_FSAL_CEPH_MKNOD = OFF-- USE_FSAL_CEPH_SETLK = OFF-- USE_FSAL_CEPH_LL_LOOKUP_ROOT = ON-- USE_FSAL_RGW = ON
这一步,很重要,很多时候会因为没有装好的librgw2-devel或者libcephfs1-devel导致这边的USE_FSAL_RGW或者USE_FSAL_CEPH状态为OFF
确保,确保,确保: -- USE_FSAL_CEPH为ON,以及-- USE_FSAL_RGW为ON。
如果是OFF,请检查下librgw2-devel或者libcephfs1-devel是否有安装,如果这两个包都已经安装了,还显示为OFF, 可以尝试下清空编译目录:rm -rf build/*,再进行编译,如果依旧为 OFF,可以尝试下删除所有的Ceph包,再重新yum install ceph librgw2-devel libcephfs1-devel -y。
编译和安装,在build目录下
makemake install
PS:
在make install生成的输出中,可以看到:-- Up-to-date: /usr/share/doc/ganesha/config_samples/rgw.conf
...
-- Up-to-date: /usr/share/doc/ganesha/config_samples/ceph.conf这两个文件就是配置将
RGW和CephFS配置为ganesha-nfs的配置模板。
注意Path后面的路径需要加引号,rgw替换成创建S3用户生成的用户信息
cat /etc/ganesha/ganesha.confEXPORT{Export_ID=1;Path = "/";Pseudo = /cephfs;Access_Type = RW;NFS_Protocols = 4;Transport_Protocols = TCP;FSAL {Name = CEPH;}}EXPORT{Export_ID=2;Path = "/";Pseudo = /rgw;Access_Type = RW;Squash = No_root_squash;NFS_Protocols = 4;Transport_Protocols = TCP;FSAL {Name = RGW;User_Id = "admin";Access_Key_Id ="1MWH3LWM1BS4ZF4HN5IH";Secret_Access_Key = "cuObxYgtl1lJgqNxOIpENycVqXfxLxZ8z5IXDM0O";}}RGW {ceph_conf = "/etc/ceph/ceph.conf";}
ganesha.nfsd -f /etc/ganesha/ganesha.conf -L /var/log/nfs-ganesha.log -N NIV_DEBUG
如果一切顺利,你应该可以看到ganesha.nfsd 进程在那,如果进程不在,那么查看Log,记得在启动进程前,关闭所有CephX配置。
重要:librgw init failed (-5) 解决方法
报错内容如下
RGW-1 : nfs-ganesha-2232083[main] create_export :FSAL :CRIT :RGW module: librgw init failed (-5)RGW-1 : nfs-ganesha-2232083[main] mdcache_fsal_create_export :FSAL :MAJ :Failed to call create_export on underlying FSAL
经过多次尝试,包括在ganesha.conf内添加init_args指定秘钥和Ceph的用户,ganesha-nfs 均无法启动,报的错如标题,解决方法就是关闭CephX,将/etc/ceph/ceph.conf内的三个 cephx改为none,然后重启ceph-mon,ceph-osd,ceph-radosgw,ceph-mds 进程,再启动ganesha-nfs,即可正常运行。
需要注意的是:
当你在当前节点上,关闭cephx后,你用ceph -s查看集群状态时,这时候会报错说明由于没有auth认证导致无法连接集群,所以我当时试了很久,尽管nfs-ganesha已经运行了,但是mount都没有成功export,查看log才发现原来在init配置的时候就失败了,导致这个问题的原因是我只关闭了一个节点的cephx,所以需要做的就是将集群内所有节点的cephx全部关闭,然后集群就可以正常访问了,并且nfs-ganesha也不会因为cephx导致加载配置出错
[root@node1 build]# showmount -eExport list for node1:/ (everyone)/ (everyone)
[root@node1 mnt]# mount -t nfs4 192.168.1.1:/ /mnt/ceph/root@node1 mnt]# ls ceph/*ceph/cephfs:testceph/rgw:my-new-bucket
说明CephFS和RGW都已经正常对接。
如果,你所使用的admin用户名下有很多的桶,那么这些桶都会以/mnt/rgw/xxbucket的结构显示出来,如果你在/mnt/rgw/下建立的一个目录,那么就相当于通过RGW建立了一个桶,所以,你执行touch /mnt/rgw/123是会报错的,因为不符合S3的对象必须位于桶内的规定,简单点说,就是把/mnt/rgw/和S3的根目录一一对应即可。
同样,CephFS内的内容都会显示在/mnt/cephfs/目录下。可以开始愉快的玩耍了!!