?? 隨著大數據時代的到來和云計算的不斷發展,作為云計算最基礎的設施存儲產品也越來越多,開源分布式存儲系統有BigTable-like系統HBase,dynamo-like系統Cassandra,voldemort,Riak,淘寶開源的OceanBase等。當然還有一些未開源系統如Yahoo! 的PNUTS,Google的BigTable等。沒有一種系統能夠在所有的workload下都是最合適的。
各個系統都會作出一些tradeoff來最大化的適應目標應用的workload。所以這就產生了一個問題,應用開發中在進行存儲系統選型的時候,哪個系統最合適?
??Yahoo! Cloud Serving Benchmark (YCSB) 是一個用來測試在線數據庫性能,擴展性的框架,Java語言實現的,下載地址在https://github.com/brianfrankcooper/YCSB/wiki?這個框架可以給系統的選型作一些指導。這個框架具有很好的可擴展性,用戶可以通過編寫Java代碼的方式來測試自己的數據庫,可以通過配置文件來指定需要進行什么樣的workload的測試,比如讀寫比例多少,每條記錄多大,每個字段多大,并發數多大,進行隨機選擇使用的分布(比如讀一條數據的時候)等。
?? 以下為YCSB的架構圖:
??
其中,灰色部分用戶可以自己定制。
DB Interface Layer
和存儲服務進行交互,例如read,update,delete,scan,insert記錄等操作,最終都是通過DB Interface Layer交互的。針對具體的數據庫,需要實現自己的DB Interface Layer,所以這個類的實現需要調用數據庫服務器的AP,DB Interface LayerI對應于抽象類 ?com.yahoo.ycsb.DB ,這個抽象類中主要有如下方法:
//Read a single recordpublic int read(String table, String key, Set fields, HashMap result);//Perform a range scanpublic int scan(String table, String startkey, int recordcount, Set fields, Vector> result);//Update a single recordpublic int update(String table, String key, HashMap values);//Insert a single recordpublic int insert(String table, String key, HashMap values);//Delete a single recordpublic int delete(String table, String key);
Workload Executor:
是用來產生workload的,針對存儲服務的操作最終都是通過調用com.yahoo.ycsb.DB中的方法來實現的,Workload Executor對應于抽象類com.yahoo.ycsb.Workload
這個抽象類中有如下幾個主要方法:
public void init(Properties p) throws WorkloadException
?? YCSB Client啟動的時候可以指定使用的線程數,這個方法用來初始化scenario和一些線程間的共享信息,只會被調用一次。
public Object initThread(Properties p, int mythreadid, int threadcount) throws WorkloadException
?? 每個客戶端線程都會執行一次這個方法,用來初始化thread-specific的一些狀態信息,返回的Object對象封裝所有的和這個線程相關的狀態信息,并且這個返回的Object會被
? 傳遞給以下兩個方法的第二個參數。
public abstract boolean doInsert(DB db, Object threadstate)
? 這個函數用于創建一條record,它需要知道目標數據庫服務器的record的結構,然后插入數據庫,插入操作會調用DB中的相應的方法。
public abstract boolean doTransaction(DB db, Object threadstate)
? 這個函數會被多個線程調用,所以這個函數必須是線程安全的。這個函數用來進行一次transaction操作,其實就是一種邏輯的操作,這個邏輯的操作中可能會包含多個DB中的基本操作。客戶端啟動的時候可以指定operation的次數,這個次數就是這個函數的調用次數。
客戶端的每個線程都會維護一個DB的instance和一個workload的instance 。
?