【操作教程】利用YCSB測試巨杉資料庫性能
一、前言
巨杉資料庫(SequoiaDB)是國內第一款新一代文檔型分散式資料庫,巨杉資料庫由巨杉軟體完全自主研發,擁有完全自主知識產權,不基於任何其它的開源項目。SequoiaDB資料庫是為分散式存儲、並行計算模型、雲計算資源條件下搭建和運行應用程序而設計的。
作為一款操作性資料庫,巨杉資料庫在海量數據實時讀寫場景具有得天獨厚的優勢,擁有較高的讀寫性能。為便於跟其他同類資料庫進行比較,在本篇文章中,我們介紹一個專門用於對NoSQL資料庫產品進行性能測試的工具——YCSB。二、YCSB介紹
YCSB全稱為Yahoo! Cloud Serving Benchmark,是雅虎開源的一款通用的性能測試框架。YCSB不僅安轉簡單,還可以自由擴展測試數據類型和支持的資料庫產品。通過對其進行擴展,YCSB可以支持對多個不同的NOSQL產品進行性能測試,通過測試結果可以了解資料庫在並發寫入、讀取、更新時的一些指標,比如吞吐量、操作延遲等。
YCSB是由Java語言實現的性能測試工具,其架構如圖一所示:圖一 YCSB架構圖
Workload Executor是產生應用負載的,DB Interface Layer是將特定資料庫的API轉為YCSB的API,用戶可以自定義負載和資料庫。
YCSB包括兩個組件:
YCSB客戶端,一個可擴展的工作負載生成器;
核心工作負載,一組由YCSB客戶端執行的工作負載場景。
YCSB包括一組核心工作負載,其中定義了基本的性能測試場景。利用這些工具負載得到的性能數據,可以對大多數不同系統的性能做出權衡。
目前,YCSB的核心工作負載包括6種,其中的5種如表一所示:
表一 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 recordpublic int read(String table, String key, Set<String> fields, HashMap<String,String> result); //Perform a range scanpublic int scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String,String>> result); //Update a single recordpublic int update(String table, String key, HashMap<String,String> values); //Insert a single recordpublic int insert(String table, String key, HashMap<String,String> values); //Delete a single recordpublic 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,如圖二所示:圖二 ycsb源文件修改
也可以從SequoiaDB獲取YCSB測試工具包,我們已經依據YCSB的結構實現了DB Interface Layer,而且我們根據需要對開源YCSB測試工具包進行了整理。我們將與YCSB自身實現相關的文件放在ycsb目錄下,將產品實現相關包放在product目錄下,在測試相關產品時,先執行ycsb-0.1.4目錄下的copy.sh將相關產品的包拷入ycsb目錄下。3.3 配置工作負載
工作負載定義了loading階段將要裝載到資料庫中的數據和transaction階段針對初始化測試數據將要執行的操作。工作負載可以通過參數文件進行定義,也可以在命令行指定。當同時指定時,命令行參數會生效。如果使用參數文件,它在測試的兩個階段都會用到。
參數文件可配置項如表二所示:
表二 參數說明另外,與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為例,數據裝載過程的狀態信息如圖三所示:
圖三 數據裝載過程狀態信息
數據裝載性能也是資料庫性能的一個參考指標,我們需要關注的是INSERT AverageLatency,代表的是插入操作的平均時延,最後的結果會以Excel表的形式導出,方便後續進行結果的統計分析。
3.6 執行測試
數據裝載完成後,可以通過如下命令執行測試:
./bin/ycsb run sequoiadb workloads/sequoia1 -s
測試過程也會定期列印狀態信息,以95%update5%read為例,測試過程的狀態信息如圖四所示:
圖四 測試執行過程狀態信息
測試執行完後,測試結果也會以Excel的形式導出,導出文件路徑和導出文件名通過參數exportfile進行配置。測試結果內容如圖五所示:圖五 YCSB測試結果內容
從測試結果可以得到總的吞吐量(Throughput)、總耗時(RunTime)以及每一類操作的操作數(Operations)、平台時延(AverageLatency)、最大時延(MaxLatency)、最小時延(MinLatency)等,也可以查看指標隨時間序列的變化情況。四、測試案例
YCSB測試結果中包含多個測試指標值,這些指標值用於評估NoSQL資料庫性能時能從各個不同方面對所測試產品進行評估。因此,在用YCSB對SequoiaDB進行測試時,應根據測試目的進行測試規劃,並針對性地進行測試結果分析。
若需要跟其他同類產品進行比較,可以使用YCSB默認支持的6種核心工作負載;若要評估SequoiaDB的水平擴展能力,可以以某一個工作負載(比如只讀場景)為基礎,通過水平增加物理伺服器數量,分析性能隨物理伺服器的變化情況。本文中我們以YCSB常見的幾個工作負載為例,說明利用YCSB對SequoiaDB的整體性能進行評估。
4.1 測試環境
資料庫服務
測試客戶端
軟體及版本
4.2 物理部署
每台測試機器上部署一個數據節點,每個數據節點構成單獨的數據節點組。每個機器上都部署有協調節點,可以連接到任意一台物理機上進行數據訪問。
圖六 SequoiaDB物理部署
4.3 測試結果
測試場景包括插入、單純查詢、查詢為主、查詢更新平衡、更新為主、單純更新六個場景,結果如表四、圖七所示:
表四 YCSB測試結果圖七 YCSB測試結果
從結果中可以看到,在當前硬體環境條件下,SequoiaDB的插入性能達到122249TPS/S,單純查詢和以查詢為主的性能都超過30000TPS/S,單純更新性能達到18131TPS/S。整體性能非常優秀。YCSB測試過程中YCSB測試客戶端的資源利用情況為:
圖八 YCSB測試客戶端資源利用情況
SequoiaDB集群伺服器資源利用情況為:
圖九 SequoiaDB集群伺服器資源利用情況
可以看到,由於YCSB測試客戶端的CPU利用率幾乎跑滿,成為性能測試的瓶頸。因此,在改善現有硬體測試環境的情況下,可以提升現有性能測試結果。
五、結論
SequoiaDB完善的功能和良好的可擴展性不僅使其可以使用通用的性能測試工具進行性能評估,也為SequoiaDB的應用開發提供了極大便利。從整體上來看,SequoiaDB性能表現出色,並且還根據國內實際的應用場景做了非常多的本地化優化工作,使得用戶在使用SequoiaDB來構建大數據平台時,能在性能和功能上都得到一個比較好的體驗。
SequoiaDB巨杉資料庫2.6最新版下載
SequoiaDB巨杉資料庫技術博客SequoiaDB巨杉資料庫社區推薦閱讀: