Ceph

rgw实现nfs

2019-01-09  本文已影响21人  Joncc

ceph
一、功能介绍
关于rgw实现nfs接口这个,刚接触的人可能并不清楚这个是个什么样的服务架构,rgw是ceph里面的对象存储接口,而nfs则是纯正的网络文件系统接口,这二者如何结合在一起,关于这个,有几个相关的链接供大家了解

ceph官方的RGW_NFS项目规划
麦子迈关于RGW_NFS的文章
之所以这个功能能实现这么快,原因是nfs-ganesha的开发者Matt Benjamin加入到了Redhat,而ceph目前的开发是Redhat在主导开发,所以功能的实现是非常快的,但是目前官方并没有提供相关的文档,个人推测是功能并未完全开发完成,一旦未完全开发完成的功能放出来,邮件列表和Bug列表就会有很多相关问题,开发者应该还是希望安静的把功能做好,再提供相关的文档,而这个功能也是在ceph 的jewel版本里面才加入的

二、功能架构图


image.png

简单说明一下:
集群配置s3接口,nfs-genesha将s3接口转换成nfs,然后nfs客户端挂载后访问的就是s3的bucket里面的数据了

三、准备工作
准备代码,这个是需要从源码编译的,并且需要将模块编译进去才可以的,源码分支地址:

https://github.com/nfs-ganesha/nfs-ganesha/tree/V2.3-stable

这个地方要注意下,需要使用next分支(此分支开发中有编译BUG),换分支V2.3-stable
使用git 进行clone分支到本地

git clone -b V2.3-stable https://github.com/nfs-ganesha/nfs-ganesha.git
cd nfs-ganesha/
git submodule update --init --recursive

检查是否有这个RGW模块目录

nfs-ganesha/src/FSAL/FSAL_RGW/

默认clone下来后 nfs-ganesha/src/libntirpc/ 这个目录是空的,而这个是因为如果在git里面某个目录嵌套的用了其他项目的代码,并且也是有git的分支的话,clone下来就会是空的,这个在ceph的源码里面也会这样,具体的看看下图:


上面的git submodule会将缺的代码下载下来,所以不要漏步骤

代码的编译采用的是cmake的模式(cmake目录后面接的是nfs-ganesha代码的src目录)

注意在执行cmake之前编译环境需要安装librgw2-devel这个包,才能编译成功,执行cmake的时候检查下是否真的开启了
如果是ubuntu:
安装 librgw2-dbg这个 包,然后做个链接:ln -s /usr/lib/x86_64-linux-gnu/* /usr/lib64/

开始编译安装过程,创建一个用于编译的目录

cd src/
mkdir build
cd build/
cmake -DUSE_FSAL_RGW=ON ../
make
make install 

编译安装工作就到此完成了,还是比较简单的

四、配置服务
1、准备一个s3的环境,我的如下:
radosgw-admin user create --uid=admin --display-name="admin" --access-key=admin --secret=admin
用户信息如下:

s3的User_Id:admin
s3的Access_Key:admin
s3的Secret_Access_Key:admin

注意,配置ganesha-nfs服务的机器需要安装librgw

2、修改ganesha-nfs的配置文件

vim /etc/ganesha/ganesha.conf

修改如下:

EXPORT
{
        Export_ID=1;

        Path = "/";

        Pseudo = "/";

        Access_Type = RW;

        NFS_Protocols = 4;

        Transport_Protocols = TCP;

        FSAL {
                Name = RGW;
                User_Id = "admin";
                Access_Key_Id ="admin";
                Secret_Access_Key = "admin";
        }
}

RGW {
    ceph_conf = "/etc/ceph/ceph.conf";
}

RGW-NFS配置文件的模板路径在:

/usr/share/doc/ganesha/config_samples/rgw.conf

4、启动ganesha-nfs服务

systemctl restart  nfs-ganesha.service

5、NFS客户端挂载ganesha-nfs服务
找一台其它的客户端机器

mount -t nfs 192.168.8.106:/ /mnt

直接挂载即可,这里注意因为rgw是没有文件系统的容量概念的,这里df是看不到的,所以用mount命令检测

root@lab8107:~# mount|grep mnt
192.168.8.106:/ on /mnt type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.8.107,local_lock=none,addr=192.168.8.106)
192.168.8.106:/testnfsrgw on /mnt/testnfsrgw type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.8.107,local_lock=none,addr=192.168.8.106)

可以查看挂载的目录里面的子目录对应的就是bucket

root@lab8107:~# ll /mnt/
total 4
drwxrwxrwx  3 root root    0 Jan  1  1970 ./
drwxr-xr-x 25 root root 4096 Apr 13 03:04 ../
drwxrwxrwx  3 root root    0 Jan  1  1970 testnfsrgw/

五、总结
在实现这个功能以后,实际上为文件接口和对象接口打通了一个通道,能够方便的实现传统的文件接口的数据到对象接口的转移,在性能方面,本篇并没有做测试,这个交给实际项目中去检测了,如果有问题欢迎探讨

参考:http://www.zphj1987.com/2016/06/19/rgw%E5%AE%9E%E7%8E%B0nfs%E7%9A%84%E9%A6%96%E6%B5%8B/

上一篇 下一篇

猜你喜欢

热点阅读