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 
#include 
#include 
#include "api/glfs.h"
#include "api/glfs-handles.h"
#include 
#include 

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  \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%之间不等的性能提升,等有好的系统配置我再测试一下,同学们有高大上的环境也可以跑跑看。

你可能感兴趣的:(数据存储,GlusterFS,libgfapi,samba)