Gluster libgfapi接口和应用实例
Posted 刘爱贵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gluster libgfapi接口和应用实例相关的知识,希望对你有一定的参考价值。
1、GlusterFS Libgfapi接口简介众所周知,GlusterFS分布式文件系统最为常用的访问接口是Native协议接口,即基于FUSE实现的POSIX兼容接口。这种接口相对于NAS访问接口,性能较好,而且对传统应用或遗留系统具有良好的适用性,应用程序不需要做任何修改。之前的NAS访问协议,比如CIFS、NFS、FTP,也都是在FUSE接口基础上通过增加一层NAS服务来实现相应功能,从而构成集群NAS的系统形态。但是由于FUSE是一种用户态的文件系统接口,需要多次在用户态和内核态进行上下文交换(context switch),从而产生一定的性能损耗,尤其是对NAS访问来说,性能损耗更为严重。
为了解决这个问题,GlusterFS从3.4版本开始提供了libgfapi接口,通过缩减I/O路径(前后对比如上图所示),帮助各种应用进一步提升性能。Libgfapi是一个用户空间的GlusterFS数据访问接口API函数库,可以绕开FUSE挂载点直接访问glusterfs卷,直接在应用程序通过调用API来访问数据。它缩减了FUSE和内核VFS层的I/O访问路径,通过它访问glusterfs卷,性能和latency均可以得到大幅提升。目前,QEMU、Samba、Ganesha等应用都基于libgfapi实现了相应的plugin,事实上也验证了性能得到了大幅提升。Libgfapi定义并实现了一组POSIX兼容API,与FUSE接口中的API一一对应,具体可以参考glfs.h头文件定义。应用程序中调用libgfapi,大致分为如下三个步骤:
(1) Gluster环境初始化
glfs = glfs_new(“volname”);
glfs_set_volfile_server(glfs, transport, server, port);
glfs_init(glfs)
(2) libgfapi接口调用
glfs_preadv_async(), glfs_writev_async()
glfs_open(), glfs_creat(), glfs_close()
glfs_truncate(), glfs_fstat()
glfs_fsync_async()
(3) Gluster环境释放
glfs_fini()
2、Libgfapi C语言调用实例
在glusterfs 3.4及更高版本源码中,API目录中包含了example C实例,可以直接参考学习。但是那个相对复杂一点,这里我们给出一个简单的C实例程序,帮助大家理解libgfapi的使用方法。
/* glfs_example.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "api/glfs.h"
#include "api/glfs-handles.h"
#include <string.h>
#include <time.h>
int
main (int argc, char *argv[])
glfs_t *fs2 = NULL;
int ret = 0;
glfs_fd_t *fd = NULL;
glfs_fd_t *fd2 = NULL;
char readbuf[32];
char writebuf[32];
char *filename = "/filename2";
if (argc != 3)
printf ("Expect following args\\n\\t%s <volname> <hostname>\\n", argv[0]);
return -1;
/* 初始化gluster环境 */
fs2 = glfs_new (argv[1]);
if (!fs2)
fprintf (stderr, "glfs_new: returned NULL\\n");
return 1;
ret = glfs_set_volfile_server (fs2, "tcp", argv[2], 24007);
ret = glfs_set_logging (fs2, "/dev/stderr", 1);
ret = glfs_init (fs2);
fprintf (stderr, "glfs_init: returned %d\\n", ret);
/* 进行libgfapi函数调用 */
fd = glfs_creat (fs2, filename, O_RDWR, 0644);
fprintf (stderr, "%s: (%p) %s\\n", filename, fd, strerror (errno));
fd2 = glfs_open (fs2, filename, O_RDWR);
fprintf (stderr, "%s: (%p) %s\\n", filename, fd, strerror (errno));
sprintf (writebuf, "hi there\\n");
ret = glfs_write (fd, writebuf, 32, 0);
glfs_lseek (fd2, 0, SEEK_SET);
ret = glfs_read (fd2, readbuf, 32, 0);
printf ("read %d, %s", ret, readbuf);
glfs_close (fd);
glfs_close (fd2);
/* Gluster环境释放 */
glfs_fini (fs2);
return ret;
上面这个程序非常简单,就是使用libgfapi进行文件create, open, write, read等相关操作,这里不作过多解释。
gcc -o glfs_example glfs_example.c -L /usr/lib64/ -lgfapi -I /usr/include/glusterfs/
编译时需要指定头文件和库文件路径,并链接libgfapi.so动态库,运行上面的编译指令,我们的第一个libgfapi C程序就生成了。
3、GlusterFS Samba VFS应用方法
前面我们已经提到,Gluster社区开发者基于libgfapi实现了Samba VFS plugin,从而可以绕开FUSE实现Samba与Gluster的无缝集成,大幅提升了CIFS访问性能。目前Samba VFS plugin相对稳定,可以深入进行测试验证,勇于偿鲜者可以考虑生产环境试用。下面我们详细介绍具体的安装和配置,操作系统为CentOS 6.5,Gluster为3.4.2,Samba为3.6.9。
(1) 安装和配置GlusterFS 3.4.2
rpm -ivh openssl-1.0.1e-16.el6_5.4.x86_64.rpm openssl-devel-1.0.1e-16.el6_5.4.x86_64.rpm --replacefiles
rpm -ivh glusterfs-3.4.2-1.el6.x86_64.rpm \\
glusterfs-devel-3.4.2-1.el6.x86_64.rpm \\
glusterfs-server-3.4.2-1.el6.x86_64.rpm \\
glusterfs-api-3.4.2-1.el6.x86_64.rpm \\
glusterfs-fuse-3.4.2-1.el6.x86_64.rpm \\
glusterfs-api-devel-3.4.2-1.el6.x86_64.rpm \\
glusterfs-geo-replication-3.4.2-1.el6.x86_64.rpm \\
glusterfs-cli-3.4.2-1.el6.x86_64.rpm \\
glusterfs-libs-3.4.2-1.el6.x86_64.rpm \\
glusterfs-debuginfo-3.4.2-1.el6.x86_64.rpm \\
glusterfs-rdma-3.4.2-1.el6.x86_64.rpm
service glusterd start
chkconfig glusterd on
gluster volume create test 192.168.8.8:/brick/b1 192.168.8.8:/brick/b2
gluster volume start test
mkdir /glfs
mount -t glusterfs 192.168.8.8:/test /glfs
这里使用Gluster 3.4.2版本,也是目前主要使用的稳定版本,使用RPM安装方式。为了简化起见,将相关RPM全部进行了安装,软件包依赖关系根据实际情况进行解决。成功启动glusterd服务,创建一个hash类型卷test,并mount至 /glfs目录下。
2. 安装和配置Samba 3.6.9
使用yum安装samba,版本为3.6.9,然后编辑/etc/samba/smb.conf进行Samba配置。
这里我们创建了两个共享,分别是基于FUSE和libgfapi,后面进行对比测试。
share_api共享中,需要指定vfs object = glusterfs 和 path = /。
yum install samba
service smb start
chkconfig smb on
smb.conf
[global]
local master = no
max protocol = SMB2
posix locking = no
guest account = nobody
map to guest = bad password
security = user
passdb backend = tdbsam
kernel oplocks = no
[share_fuse]
comment = None
path = /glfs
browseable = yes
read only = no
create mask = 0744
directory mask = 0755
guest ok = Yes
[share_api]
comment = None
vfs object = glusterfs
glusterfs:volume = test
path = /
browseable = yes
read only = no
create mask = 0744
directory mask = 0755
guest ok = yes
3. 安装和配置samba-gluster-vfs
从Samba和Gluster官方网站下载samba-3.6.9和samba-glusterfs-vfs源码,然后使用如下方法进行编译安装。
wget http://ftp.samba.org/pub/samba/stable/samba-3.6.9.tar.gz
git clone git://forge.gluster.org/samba-glusterfs/samba-glusterfs-vfs.git
cd ~/samba-3.6.9/source3
./configure
cd ~/samba-glusterfs-vfs
./autogen.sh
./configure -with-samba-source=~/samba-3.6.9/source3/
make & make install
cp /usr/local/samba/lib/vfs/glusterfs.so /usr/lib64/samba//vfs/
4. 测试功能和性能
OK,安装配置完成后,我们需要重启一下samba服务,然后我们就可以访问和测试共享了。
service smb reload
testparm
\\\\192.168.8.8\\share_fuse
\\\\192.168.8.8\\share_api
图片中的性能怎么这么差?libgfapi优势也没有体现出来啊。我和小伙伴们都惊呆了! 一检查,原来是我的桌面到服务器的网络是百兆的。
之前已经有一些朋友测试过性能,有20-50%之间不等的性能提升,等有好的系统配置我再测试一下,同学们有高大上的环境也可以跑跑看。
以上是关于Gluster libgfapi接口和应用实例的主要内容,如果未能解决你的问题,请参考以下文章