rgw实现nfs
ceph
一、功能介绍
关于rgw实现nfs接口这个,刚接触的人可能并不清楚这个是个什么样的服务架构,rgw是ceph里面的对象存储接口,而nfs则是纯正的网络文件系统接口,这二者如何结合在一起,关于这个,有几个相关的链接供大家了解
ceph官方的RGW_NFS项目规划
麦子迈关于RGW_NFS的文章
之所以这个功能能实现这么快,原因是nfs-ganesha的开发者Matt Benjamin加入到了Redhat,而ceph目前的开发是Redhat在主导开发,所以功能的实现是非常快的,但是目前官方并没有提供相关的文档,个人推测是功能并未完全开发完成,一旦未完全开发完成的功能放出来,邮件列表和Bug列表就会有很多相关问题,开发者应该还是希望安静的把功能做好,再提供相关的文档,而这个功能也是在ceph 的jewel版本里面才加入的
二、功能架构图
![](https://img.haomeiwen.com/i9298220/10f78969d27c6b05.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的源码里面也会这样,具体的看看下图:
![](https://img.haomeiwen.com/i9298220/0d13fa4213067097.png)
上面的git submodule会将缺的代码下载下来,所以不要漏步骤
代码的编译采用的是cmake的模式(cmake目录后面接的是nfs-ganesha代码的src目录)
注意在执行cmake之前编译环境需要安装librgw2-devel这个包,才能编译成功,执行cmake的时候检查下是否真的开启了
如果是ubuntu:
安装 librgw2-dbg这个 包,然后做个链接:ln -s /usr/lib/x86_64-linux-gnu/* /usr/lib64/
![](https://img.haomeiwen.com/i9298220/b30380a98d92ab3f.png)
开始编译安装过程,创建一个用于编译的目录
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/