1. 程式人生 > >Gluster libgfapi介面和應用例項

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介面應用例項

1、GlusterFS Libgfapi介面簡介眾所周知,GlusterFS分散式檔案系統最為常用的訪問介面是Native協議介面,即基於FUSE實現的POSIX相容介面。這種介面相對於NAS訪問介面,效能較好,而且對傳統應用或遺留系統具有良好的適用性,應用程式不需要做任何

沉澱再出發:dubbo服務治理應用例項

沉澱再出發:dubbo服務治理和應用例項 一、前言     阿里開發的dubbo作為服務治理的工具,在分散式開發中有著重要的意義,這裡我們主要專注於dubbo的架構,基本原理以及在Windows下面開發出來的例項來解釋和介紹,從而使得dubbo不再神祕。 二、dubbo的架

Android實現登入介面功能例項

最近一個android小程式需要登入功能,我簡單實現了一下。現在記錄下來也當做個筆記,同時也希望可以相互學習。所以,如果我的程式碼有問題,還各位請提出來。多謝了! 下面,就簡述一下此例項的主要內容: 輸入使用者名稱和密碼 ,從本地檔案userinfo.json中讀取users。判斷此使

C++中引用(&)的用法應用例項

對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高程式碼執行效率和增強程式碼質量的一個很好的辦法。在 c++學習提高篇(3)---隱式

應用層提供相應的操作介面應用層程式碼

(1)三根通訊線:SCL、SDA、GND (2)同步、序列、電平、低速、近距離 (3)匯流排式結構,支援多個裝置掛接在同一條總線上 (4)主從式結構,通訊雙方必須一個為主(master)一個為從(slave),主裝置掌握每次通訊的主動權,從裝置按照主裝置的節奏被動響應。每個從

js陣列中的find、filter、forEach、map四個方法的詳解應用例項

陣列中的find、filter、forEach、map四個語法很相近,為了方便記憶,真正的掌握它們的用法,所以就把它們總結在一起嘍。find():返回通過測試的陣列的第一個元素的值在第一次呼叫 callback 函式時會確定元素的索引範圍,因此在 find 方法開始執行之後新

Android 實現登入介面功能例項

       最近一個android小程式需要登入功能,我簡單實現了一下。現在記錄下來也當做個筆記,同時也希望可以相互學習。所以,如果我的程式碼有問題,還各位請提出來。多謝了! 下面,就簡述一下此例項的主要內容:         輸入使用者名稱和密碼 ,從本地檔案user

C++學習筆記(四)C++中友元friend的用法應用例項

C++中的友元機制允許類的非公有成員被一個類或者函式訪問,友元按型別分為三種: (1)普通非類成員函式作為友元 (2)類的成員函式作為友元 (3)類作為友元。 友元包括友元的宣告以及友元的定義。友元

C++中引用(&)的用法應用例項(相當經典!!!)

對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高程式碼執行效率和增強程式碼質量的一個很好的辦法。引用是C++引入的新語言特性,是C++常

Android中字元裝置驅動應用例項(一)——驅動部分

 下面介紹建立Android裝置對應的字元裝置驅動 1 字元驅動 在此示例中,我們將字元驅動新增到drivers/char目錄下。 (1)字元驅動的路徑如下: drivers/char/class_reg_unreg.c (2)字元驅動的內容如下: View C

Prometheus Metrics 設計的最佳實踐應用例項,看這篇夠了!

Prometheus 是一個開源的監控解決方案,部署簡單易使用,難點在於如何設計符合特定需求的 Metrics 去全面高效地反映系統實時狀態,以助力故障問題的發現與定位。本文即基於最佳實踐的 Metrics 設計方法,結合具體的場景例項——TKE 的網路元件 IPAMD 的內部監控,以個人實踐經驗談一談如何設

Android Sutdio的常用快捷鍵必備外掛,繪製介面除錯應用

常用快捷鍵 程式碼跳轉 描述:跳轉是為了方便程式碼位置的定位,存在兩種跳轉:在定義處可以跳轉到呼叫處,在呼叫處可以跳轉到定義處。 快捷鍵:Ctrl + 滑鼠單擊 方法間跳轉 描述:從一個類方法跳轉到臨近的一個類方法。 快捷鍵:Alt + Up/Down

介面應用例項

1、 打印出來的結果是“McGrand”,“Kobe”,“James”,但是加上一句,如下圖所示 (1)Array是jkd中提供的類,位於java.util.*這個包,這個類中提供了公有的靜態方法,因此可以通過它直接呼叫sort這個方法 (2)sort中不僅僅是可以傳

JQuery應用例項學習 —— 15 刪除增加DOM節點

remove:刪除 empty:清空 append:在後面加 prepend:在前面加 appendTo:追加 <!DOCTYPE html> <html lang="en"

java Collection介面Collections類的層次關係圖,類圖 ,collection集合例項

首先來看看Collection和Collections的區別,Collection和Collections是完全不同的兩個概念。Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。 Collection是個java.util下的介面,它是各

java影象介面開發簡單例項-JLabel,JFileChooser,JMenu應用

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import javax.swing.ImageIcon;import javax.swing.JFileChooser;imp

java影象介面開發簡單例項-JButton及事件的簡單應用

import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;i

java 泛型在類,介面方法上的應用

雖然我在泛型的使用這塊,應用的地方不是很多,但是還是要總結一下的,這一篇文章主要是從使用的角度,對泛型進行介紹。 如果一個類有一個或者多個型別的變數,那麼這個類就是泛型類,這些型別變數是類的型別引數。下邊這個類是一個簡單的java類,有一個屬性t,它的型別是Object 方

泛型在類介面應用

泛型就是變數型別的引數化。在使用泛型前,存入集合中的元素可以是任何型別的,當從集合中取出時,所有的元素都是Object型別,需要進行向下的強制型別轉換,轉換到特定的型別。而強制型別轉換容易引起執行時錯誤。 泛型型別引數只能被類或介面型別賦值,不能被原生

介面測試基礎-4-fiddler工具介紹應用

       本篇簡單介紹fiddler工具,通過本篇學習,可以到達fiddler的基本使用。前面工具分類介紹,fiddler是一個獨立的可以抓http請求的工具,軟體小巧,功能強大。既可以用來抓HT