GlusterFS Libgfapi接口与FUSE

2180阅读 0评论2020-06-10 hiyachen
分类:云计算

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%之间不等的性能提升,等有好的系统配置我再测试一下,同学们有高大上的环境也可以跑跑看。  
————————————————
版权声明:本文为CSDN博主「刘爱贵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuben/java/article/details/38443357
上一篇:openstack创建虚拟机-hubert
下一篇:typedef与#define区别