通过ganesha-nfs将 Ceph 导出为 NFS

栏目: IT技术资讯 发布于: 2017-04-13 09:42:19

前言

本文介绍了两种方式将 Ceph 导出为 NFS,一种通过 RGW,一种通过 CephFS,通过 FSAL 模块 连接到 RGW 或者 CephFS, 其中,FSAL_RGW 调用 librgw2 将 NFS 协议转义为 S3 协议再通过 RGW 存入到 Ceph 中,FSAL_CEPH 调用 libcephfs1 将 NFS 转义为 Cephfs 协议再存入到 Ceph 中。所以需要额外安装这两个包。

经过测试发现,FSAL_RGW 模块在压测是很不稳定,对大文件的写入经常报 io error (5)FSAL_CEPH 模块比较稳定。

声明
本文只是介绍 ganesha-nfs 的部署方式,不代表其能否在生产环境使用。

另外,本文部署环境为,Ceph -> Jewel, ganesha-nfs -> V2.4-stable, OS -> CentOS 7。

Git下载编译

对于 Jewel 版本的 Ceph,前往 nfs-ganesha 的Git,下载 V2.4-stable,安装一些依赖后,通过源码部署,操作系统是CentOS-7.2.1511, Ceph 版本是 Jewel:

下载

1
git clone -b V2.4-stable https://github.com/nfs-ganesha/nfs-ganesha.git --recursive

安装依赖


1  yum install gcc git cmake autoconf libtool bison flex doxygen openssl-devel  gcc-c++ libuuid-devel nfs-utils -y
2
3  # 如果要生成 FSAL_RGW 模块,需要安装 librgw2-devel
4  yum install librgw2-devel -y
5
6  # 如果要生成 FSAL_CEPH 模块,需要安装 libcephfs1-devel
7  yum install libcephfs1-devel -y

编译 nfs-ganesha, 注意打开对应的模块

  • 如果需要生成 FSAL_RGW 模块,则在编译选项中添加: -DUSE_FSAL_RGW=ON。

  • 如果需要生成 FSAL_CEPH 模块,则在编译选项中添加: -DUSE_FSAL_CEPH=ON



注意,在 cmake 的输出中,会有如下输出:



确保,确保,确保: --USE_FSAL_CEPH 为 ON,以及 -- USE_FSAL_RGW 为 ON


如果是OFF,请检查下librgw2-devel或者libcephfs1-devel是否有安装,如果这两个包都已经安装了,还显示为OFF,可以尝试下清空编译目录:rm -rf /tmp/build/*,再进行编译,如果依旧为 OFF,可以尝试下删除所有的 Ceph 包,再重新 yum install ceph librgw2-devel libcephfs1-devel -y

这两项编译输出为 OFF 的输出可能如下:

  1  -- Looking for ceph_ll_lookup in cephfs
2  -- Looking for ceph_ll_lookup in cephfs - not found
3  -- Found cephfs libraries: CEPHFS_LIBRARY-NOTFOUND
4  -- Could NOT find CEPHFS (missing:  CEPHFS_INCLUDE_DIR CEPHF   S_LIBR ARY_DIR)
5  CMake Warning at CMakeLists.txt:564 (message):
6   Cannot find CEPH runtime.  Disabling CEPH fsal build
7  
8  
9  -- Looking for rgw_mount in rgw
10 -- Looking for rgw_mount in rgw - not found
11 -- Found rgw libraries: RGW_LIBRARY-NOTFOUND
12 -- Could NOT find RGW: Found unsuitable version "0.0", but r   equire d is at least "1.1" (found )
13 CMake Warning at CMakeLists.txt:577 (message):
14  Cannot find supported RGW runtime. Disabling RGW fsal build
15  ...
16  -- USE_FSAL_CEPH = OFF
17  ...
18  -- USE_FSAL_RGW = OFF


编译,安装



TIP
 make install 生成的输出中,可以看到:



这两个文件就是配置将 RGW 和 CephFS 配置为 ganesha-nfs 的配置模板。


编辑配置文件


上面配置的为 CephFS 的配置,下面的配置为 RGW 的配置。

其中,User_Id , Access_Key_Id, Secret_Access_Key 根据自己的环境进行修改。

librgw init failed (-5) 解决方法

经过多次尝试,包括在ganesha.conf内添加init_args 指定秘钥和Ceph的用户,ganesha-nfs均无法启动,报的错如标题,解决方法就是关闭CephX,将/etc/ceph/ceph.conf内的三个 cephx改为none,然后重启 ceph-mon,ceph-osd,ceph-radosgw,ceph-mds进程,再启动ganesha-nfs,即可正常运行。

完整报错信息如下:

1

2

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-nfs

1
ganesha.nfsd -L /var/log/ganesha.log

如果一切顺利,你应该可以看到 ganesha.nfsd 进程在那,如果进程不在,那么查看Log,记得在启动进程前,关闭所有 CephX 配置。


挂载 nfs

1
mount -t nfs4 {$ganesha-server-ip}:/  /mnt

此时,ll /mnt/ 如果顺利的话,会看到:



说明 CephFS 和 RGW 都已经正常对接。不过,我在操作过程中,看到了一个报错信息:

1
2
ls /mnt/ls:
正在读取目录/mnt/: 远程 I/O 错误

这个现象是可以复现的,复现指令如下:

目前找到的一个比较笨的解决方法是,具体原因还不太清楚,但是目录显示正确后,不会再发生远程I/O 错误:



如果,你所使用的admin用户名下有很多的桶,那么这些桶都会以/mnt/rgw/xxbucket的结构显示出来,如果你在/mnt/rgw/下建立的一个目录,那么就相当于通过 RGW 建立了一个桶,所以,你执行touch /mnt/rgw/123 是会报错的,因为不符合S3的对象必须位于桶内的规定,简单点说,就是把/mnt/rgw/和S3的根目录一一对应即可。


同样,CephFS 内的内容都会显示在/mnt/cephfs/目录下。可以开始愉快的玩耍了!!!

RGW 模块测试时遇到的一些问题

我将 ganesha-nfs 部署到一个较大的集群中去,然后挂载NFS,对挂载目录进行压力测试,测试指令如下:

1
for i in {0..1000} ;do dd if=/dev/zero of=./$i bs=4k count=$i; done;

目的是,快速写入4KB~4MB不同大小的对象,现象是:

对于200KB以下的文件,写入正常,万次测试没有出现ioerror

对于400KB~1MB的文件,有5%的可能性,文件写入时报 ioerror(5)。

对于2MB以上的文件,有40%的可能性,文件写入报 ioerror(5)。


也就是说,对于几十KB的小文件写入,没有见到过ioerror,对于1MB以上的大文件写入,有很大(70% for 100MB+)概率报 ioerror(5)。 原因不明。希望知道原因的朋友可以指导下!

将 RBD 导出为 NFS。

指令很简单,这里就不细说,具体可以参考一篇keepalived+ceph rbd配置nfs的高可用文章:

RBD 和 CephFS 导出的 NFS 速度测试

测试机选择了一台非 NFS 提供节点作为 客户端,使用 FIO 进行测试:

1
fio  -direct=1 -iodepth 32 -thread -ioengine=libaio -bs=4K/4M -size=10G  -runtime=60 -group_reporting -name=mytest -filename=/mnt/xxx -rw=randwrite

结果如下,另外测了一次ceph-fuse挂载的写速度,还有使用kernel挂载cephfs的速度:




本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。
转载请注明:文章转载自 [http://www.php230.com]
本文标题:通过ganesha-nfs将 Ceph 导出为 NFS
IT技术书籍推荐:
深入理解MySQL核心技术
深入理解MySQL核心技术
Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)
《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。
最新互联网资讯