厦门哪里有建设网站的,阿里云主机可以放几个网站,公司装修合同,个人网站主题随着大数据时代的到来和云计算的不断发展#xff0c;作为云计算最基础的设施存储产品也越来越多#xff0c;开源分布式存储系统有BigTable-like系统HBase#xff0c;dynamo-like系统Cassandra#xff0c;voldemort#xff0c;Riak#xff0c;淘宝开源的OceanBase等。当然… 随着大数据时代的到来和云计算的不断发展作为云计算最基础的设施存储产品也越来越多开源分布式存储系统有BigTable-like系统HBasedynamo-like系统CassandravoldemortRiak淘宝开源的OceanBase等。当然还有一些未开源系统如Yahoo! 的PNUTSGoogle的BigTable等。没有一种系统能够在所有的workload下都是最合适的。 各个系统都会作出一些tradeoff来最大化的适应目标应用的workload。所以这就产生了一个问题应用开发中在进行存储系统选型的时候哪个系统最合适 Yahoo! Cloud Serving Benchmark (YCSB) 是一个用来测试在线数据库性能扩展性的框架Java语言实现的下载地址在https://github.com/brianfrankcooper/YCSB/wiki 这个框架可以给系统的选型作一些指导。这个框架具有很好的可扩展性用户可以通过编写Java代码的方式来测试自己的数据库可以通过配置文件来指定需要进行什么样的workload的测试比如读写比例多少每条记录多大每个字段多大并发数多大进行随机选择使用的分布(比如读一条数据的时候)等。 以下为YCSB的架构图 其中灰色部分用户可以自己定制。 DB Interface Layer 和存储服务进行交互例如readupdatedeletescaninsert记录等操作最终都是通过DB Interface Layer交互的。针对具体的数据库需要实现自己的DB Interface Layer所以这个类的实现需要调用数据库服务器的APDB 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 。 另外 YCSB客户端进行workload的时候需要进行很多的随机选择比如读/写哪条记录scan的时候scan多少条做什么操作(insert ,update read scan)这些由很多的分布进行决定 Uniform当读一条记录的时候任何一条记录被读取的概率都是相等的。 zipfian选择记录的时候遵循这个分布这个分布的特点是有些记录就是更popular有些记录就是不popular latest比如最近插入的数据最popular multinomial多项式分布每个item被选择的概率是确定的例如read操作0.95update操作0.05scan操作概率为0那么这就是一次read-heavy的负载。 参考文献 Benchmarking Cloud Serving Systems with YCSB 转载于:https://www.cnblogs.com/foxmailed/archive/2012/02/29/2374595.html