【操作教程】利用YCSB測試巨杉資料庫效能

SequoiaDB發表於2016-11-09

一、前言

巨杉資料庫(SequoiaDB)是國內第一款新一代文件型分散式資料庫,巨杉資料庫由巨杉軟體完全自主研發,擁有完全自主智慧財產權,不基於任何其它的開源專案。SequoiaDB資料庫是為分散式儲存、平行計算模型、雲端計算資源條件下搭建和執行應用程式而設計的。

作為一款操作性資料庫,巨杉資料庫在海量資料實時讀寫場景具有得天獨厚的優勢,擁有較高的讀寫效能。 為便於跟其他同類資料庫進行比較,在本篇文章中,我們介紹一個專門用於對NoSQL資料庫產品進行效能測試的工具——YCSB。

二、YCSB介紹

YCSB全稱為Yahoo! Cloud Serving Benchmark,是雅虎開源的一款通用的效能測試框架。YCSB不僅安轉簡單,還可以自由擴充套件測試資料型別和支援的資料庫產品。通過對其進行擴充套件,YCSB可以支援對多個不同的NOSQL產品進行效能測試,通過測試結果可以瞭解資料庫在併發寫入、讀取、更新時的一些指標,比如吞吐量、操作延遲等。

YCSB是由Java語言實現的效能測試工具,其架構如圖一所示:

enter image description here

圖一 YCSB架構圖

Workload Executor是產生應用負載的,DB Interface Layer是將特定資料庫的API轉為YCSB的API,使用者可以自定義負載和資料庫。

YCSB包括兩個元件: YCSB客戶端,一個可擴充套件的工作負載生成器; 核心工作負載,一組由YCSB客戶端執行的工作負載場景。

YCSB包括一組核心工作負載,其中定義了基本的效能測試場景。利用這些工具負載得到的效能資料,可以對大多數不同系統的效能做出權衡。

目前,YCSB的核心工作負載包括6種,其中的5種如表一所示:

enter image description here

表一 YCSB核心工作負載

使用者可以自定義不同操作(read、update、scan、insert)的比例,選擇操作目標記錄的分佈:Zipfian(隨機選擇記錄,存在熱記錄)、Uniform(等概率隨機選擇記錄)和Latest(近期寫入的記錄是熱記錄)。

三、SequoiaDB測試步驟

利用YCSB對SequoiaDB進行測試時,可以按照本章的步驟進行。這裡的測試步驟假定只需要執行一個YCSB客戶端,因為對於一個9-12臺機器的叢集規模來說,一個YCSB客戶端已經足夠。對於更大規模的叢集,為了產生足夠大的測試壓力,可能需要同時執行多個YCSB客戶端。但是,在執行一個YCSB客戶端不能得到理想的測試結果時,可以嘗試並行地執行多個YCSB客戶端來提升測試效能。

3.1 安裝資料庫叢集

在測試的硬體環境上安裝SequoiaDB,並部署好叢集。在執行YCSB客戶端之前,需要先建立表來存放資料,對應到SequoiaDB中就是集合,預設情況下,完整的集合名稱為ycsb.usertable,ycsb為集合空間,usertable為集合。

為了充分發揮SequoiaDB的分散式處理能力,測試資料需要儘可能打散到多個資料分割槽組裡面。因此,在建立集合的時候需要注意指定Domain引數,Domain值為包含SequoiaDB叢集中所有資料節點的資料域。假如叢集中包含三個資料分割槽組:datagroup1、datagroup2、datagroup3,建立集合的語句為:

   > var global_domain = db.createDomain("global_domain ", ['datagroup1',' datagroup 2',' datagroup 3'], {AutoSplit:true})
    > db.createCS("ycsb", {Domain:" global_domain "})
    > db.ycsb.createCL("usertable", {ShardingKey:{_id:1}, ShardingType:"hash"})

3.2實現DB介面層

目前版本的YCSB預設不支援SequoiaDB,不能直接用於SequoiaDB的測試,但是YCSB作為通用的測試框架,提供了一套方法對其本身進行擴充套件。所以,在開始測試前,我們需要按照YCSB的擴充套件要求實現其對SequoiaDB的支援。

DB介面層是一個java類,當YCSB客戶端發起讀、寫、更新、刪除請求時,DB介面層負責將這些查詢轉化為對應資料的API。當執行YCSB客戶端時,需要在命令列指定DB介面層的類名,客戶端會動態地載入資料庫的介面類。命令列或者負載檔案中指定的引數值也會傳遞給DB介面類例項。

DB介面層隱藏了特定資料庫的實現細節,當實現了DB介面層後,可以通過YCSB客戶端對資料庫進行效能測試而不用關心資料庫的具體實現,且不需要改變。

DB介面層是一個提供了資料庫read、insert、update、delete、scan介面的虛類。因此,需要使用SequoiaDB的java驅動實現這幾個方法。建立一個工程,新建一個名為SequoiaDBClient的類,並讓其繼承com.yahoo.ycsb.DB。

首先,實現init方法。init方法主要用於對資料庫物件進行初始化。由於我們使用了SequoiaDB連線池的技術,因此,需要在init方法中進行初始化。連線池初始化的程式碼示例如下:

try {
        SequoiadbOption sdbOption = new SequoiadbOption();
        sdbOption.setMaxConnectionNum(maxConnectionnum);
        sdbOption.setMaxIdeNum(maxidleconnnum);
        sdbOption.setRecheckCyclePeriod(period * 1000);
        ConfigOptions connectOpt = new ConfigOptions();
        connectOpt.setConnectTimeout(500);
        connectOpt.setMaxAutoConnectRetryTime(0);
        ArrayList<String> urls = new ArrayList<String>();
        if (hosts != null){
            for (int i= 0;i< hosts.length;++i){
                urls.add(hosts[i]+":"+port);
                System.out.println(i+ "url" + urls.get(i));
            }
        }else{
            String[] urlset = surl.split(",");
            for (int i= 0;i< urlset.length;++i){
                urls.add(urlset[i]);
                System.out.println(i+ "url" + urls.get(i));
            }
        }
        sdbpools = new SequoiadbDatasource(urls,"","", connectOpt,sdbOption);
} catch (Exception e) {
    System.err.println("Could not initialize Sequoiadb connection pool for Loader: "
                    + e.toString());
    e.printStackTrace();
    throw new DBException(e.toString());
}

然後,實現查詢和更新方法。需要實現的方法為:

//Read a single record
public int read(String table, String key, Set<String> fields, HashMap<String,String> result);

//Perform a range scan
public int scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String,String>> result);

//Update a single record
public int update(String table, String key, HashMap<String,String> values);

//Insert a single record
public int insert(String table, String key, HashMap<String,String> values);

//Delete a single record
public int delete(String table, String key);

每個方法都包括一個集合名稱和一個記錄鍵值的引數,對於讀操作(read、scan)還有讀操作的返回欄位值及返回結果。update和insert還包括欄位名和欄位值得HashMap。

SequoiaDB的read、update、insert、delete使用方法請參考官網Java驅動開發文件。

最後,將以上的實現打成jar包sequoiadb-binding-0.1.4.jar,並放到ycsb-0.1.4目錄下。修改bin/ycsb原始檔,在dict DATABASES中新增產品SequoiaDB,如圖二所示:

enter image description here

圖二 ycsb原始檔修改

也可以從SequoiaDB獲取YCSB測試工具包,我們已經依據YCSB的結構實現了DB Interface Layer,而且我們根據需要對開源YCSB測試工具包進行了整理。我們將與YCSB自身實現相關的檔案放在ycsb目錄下,將產品實現相關包放在product目錄下,在測試相關產品時,先執行ycsb-0.1.4目錄下的copy.sh將相關產品的包拷入ycsb目錄下。

3.3 配置工作負載

工作負載定義了loading階段將要裝載到資料庫中的資料和transaction階段針對初始化測試資料將要執行的操作。工作負載可以通過引數檔案進行定義,也可以在命令列指定。當同時指定時,命令列引數會生效。如果使用引數檔案,它在測試的兩個階段都會用到。

引數檔案可配置項如表二所示:

enter image description here

表二 引數說明

另外,與SequoiaDB實現相關的引數包括:

enter image description here

表三 SequoiaDB相關引數

實踐中建議將重要引數放置在引數檔案中,而不是通過命令列的方式指定,便於複用。

3.4 選擇合適的執行引數

通過引數檔案,我們可以定義一個特定的工作負載,除此之外,還有其他的引數可以在執行效能測試時指定,即執行引數。執行引數在執行YCSB客戶端時通過命令列指定。執行引數包括: -threads:客戶端執行緒數。預設情況下,YCSB客戶端只執行一個執行緒,可以通過增加執行緒數提高整體吞吐量。 -target:每秒運算元目標值。 -s:狀態(status)。YCSB客戶端定期列印狀態,預設情況下,每10s會將執行狀態列印出來。

3.5初始化測試資料

工作負載有兩個可執行階段:初始化測試資料(loading phase)和測試執行(transaction phase)。初始化測試資料使用如下命令:

./bin/ycsb load sequoiadb workloads/sequoia1 -s

資料插入過程需要關注YCSB客戶端定期列印的狀態資訊,如果需要儲存狀態資訊,可以將輸出結果重定向到檔案。以95%update5%read為例,資料裝載過程的狀態資訊如圖三所示:

enter image description here

圖三 資料裝載過程狀態資訊

資料裝載效能也是資料庫效能的一個參考指標,我們需要關注的是INSERT AverageLatency,代表的是插入操作的平均時延,最後的結果會以Excel表的形式匯出,方便後續進行結果的統計分析。

3.6執行測試

資料裝載完成後,可以通過如下命令執行測試:

./bin/ycsb run sequoiadb workloads/sequoia1 -s

測試過程也會定期列印狀態資訊,以95%update5%read為例,測試過程的狀態資訊如圖四所示:

enter image description here

圖四 測試執行過程狀態資訊

測試執行完後,測試結果也會以Excel的形式匯出,匯出檔案路徑和匯出檔名通過引數exportfile進行配置。測試結果內容如圖五所示:

enter image description here

圖五 YCSB測試結果內容

從測試結果可以得到總的吞吐量(Throughput)、總耗時(RunTime)以及每一類操作的運算元(Operations)、平臺時延(AverageLatency)、最大時延(MaxLatency)、最小時延(MinLatency)等,也可以檢視指標隨時間序列的變化情況。

四、測試案例

YCSB測試結果中包含多個測試指標值,這些指標值用於評估NoSQL資料庫效能時能從各個不同方面對所測試產品進行評估。因此,在用YCSB對SequoiaDB進行測試時,應根據測試目的進行測試規劃,並針對性地進行測試結果分析。

若需要跟其他同類產品進行比較,可以使用YCSB預設支援的6種核心工作負載;若要評估SequoiaDB的水平擴充套件能力,可以以某一個工作負載(比如只讀場景)為基礎,通過水平增加物理伺服器數量,分析效能隨物理伺服器的變化情況。本文中我們以YCSB常見的幾個工作負載為例,說明利用YCSB對SequoiaDB的整體效能進行評估。

4.1測試環境

資料庫服務

enter image description here

測試客戶端

enter image description here

軟體及版本

enter image description here

4.2物理部署

每臺測試機器上部署一個資料節點,每個資料節點構成單獨的資料節點組。每個機器上都部署有協調節點,可以連線到任意一臺物理機上進行資料訪問。

enter image description here

圖六 SequoiaDB物理部署

4.3測試結果

測試場景包括插入、單純查詢、查詢為主、查詢更新平衡、更新為主、單純更新六個場景,結果如表四、圖七所示:

enter image description here

表四 YCSB測試結果

enter image description here

圖七 YCSB測試結果

從結果中可以看到,在當前硬體環境條件下,SequoiaDB的插入效能達到122249TPS/S,單純查詢和以查詢為主的效能都超過30000TPS/S,單純更新效能達到18131TPS/S。整體效能非常優秀。 YCSB測試過程中YCSB測試客戶端的資源利用情況為:

enter image description here

圖八 YCSB測試客戶端資源利用情況

SequoiaDB叢集伺服器資源利用情況為:

enter image description here

圖九 SequoiaDB叢集伺服器資源利用情況

可以看到,由於YCSB測試客戶端的CPU利用率幾乎跑滿,成為效能測試的瓶頸。因此,在改善現有硬體測試環境的情況下,可以提升現有效能測試結果。

五、結論

SequoiaDB完善的功能和良好的可擴充套件性不僅使其可以使用通用的效能測試工具進行效能評估,也為SequoiaDB的應用開發提供了極大便利。從整體上來看,SequoiaDB效能表現出色,並且還根據國內實際的應用場景做了非常多的本地化優化工作,使得使用者在使用SequoiaDB來構建大資料平臺時,能在效能和功能上都得到一個比較好的體驗。

SequoiaDB巨杉資料庫2.6最新版下載

SequoiaDB巨杉資料庫技術部落格

SequoiaDB巨杉資料庫社群

enter image description here

相關文章