YCSB初步介绍

   随着大数据时代的到来和云计算的不断发展,作为云计算最基础的设施存储产品也越来越多,开源分布式存储系统有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 record
  public int read(String table, String key, Set fields, HashMap result);

  //Perform a range scan
  public int scan(String table, String startkey, int recordcount, Set fields, Vector> result);
	
  //Update a single record
  public int update(String table, String key, HashMap values);

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

  //Delete a single record
  public 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 。

 

另外,

YCSB客户端进行workload的时候,需要进行很多的随机选择,比如,读/写哪条记录,scan的时候scan多少条,做什么操作(insert ,update read scan),这些由很多的分布进行决定:

Uniform:当读一条记录的时候,任何一条记录被读取的概率都是相等的。

zipfian:选择记录的时候,遵循这个分布,这个分布的特点是有些记录就是更popular,有些记录就是不popular

latest:比如,最近插入的数据最popular

multinomial:多项式分布,每个item被选择的概率是确定的,例如read操作0.95,update操作0.05,scan操作概率为0,那么这就是一次read-heavy的负载。  
 
参考文献
 
posted @ 2012-02-29 21:21  吴镝  阅读(5101)  评论(0编辑  收藏  举报