YCSB ,Go-YCSB及其 Workloads 介绍

随着大数据时代的到来和云计算的不断发展,作为云计算最基础的设施存储产品也越来越多,开源分布式存储系统有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的架构图:

YCSB ,Go-YCSB及其 Workloads 介绍

其中,灰色部分用户可以自己定制。

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);

客户端的每个线程都会维护一个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的负载。   

参考文献Benchmarking Cloud Serving Systems with YCSB


go-ycsb 是YCSB 的GO 版本实现。它完全支持所有YCSB生成器和Core工作负载,因此我们可以使用Go进行基本的CRUD基准测试。

安装测试说明见:https://github.com/pingcap/go-ycsb

支持的数据库

  • MySQL / TiDB
  • TiKV
  • FoundationDB
  • Aerospike
  • Badger
  • Cassandra / ScyllaDB
  • Pegasus
  • PostgreSQL / CockroachDB
  • RocksDB
  • Spanner
  • Sqlite
  • MongoDB
  • Redis and Redis Cluster
  • BoltDB

workloads 介绍

YCSB包括一组核心工作负载,这些工作负载定义了云系统的基本基准。当然,您可以定义自己的工作负载,如实施新工作负载中所述。但是,核心工作负载是非常有用的第一步,获取各种不同系统的基准数据可以使您了解性能。 不同系统的权衡。

核心工作负载包括六个不同的工作负载:

Workload A: Update heavy workload

此工作负载包含50/50的读取和写入操作。一个应用示例是记录最近动作(actions)的会话存储(session)。此工作负载中的更新不假定您先阅读原始记录。假设所有更新写入均包含已存在记录的字段;经常只为该记录写全部字段的一个子集。一些数据存储区需要读取基础记录,以便调和最终记录的外观,但并非所有人都可以。

Workload B: Read mostly workload

此工作负载具有95/5的读/写混合。应用示例:照片标记;添加标签是一个更新,但是大多数操作都是读取标签。与Workload A一样,这些写入操作不假定您在写入原始记录之前先阅读了原始记录。

Workload C: Read only

此工作负载为100%读取。应用示例:用户配置文件缓存,其中配置文件在其他地方(例如Hadoop)构建。

Workload D: Read latest workload

在此工作负载中,将插入新记录,并且最近插入的记录是最受欢迎的。应用示例:用户状态更新;人们想阅读最新消息。

Workload E: Short ranges

在此工作负载中,查询的是短范围的记录,而不是单个记录。应用示例:线程对话,其中每次扫描都是针对给定线程中的posts(假定按线程ID进行聚类)。

Workload F: Read-modify-write

在这种工作负载下,客户端将读取记录,对其进行修改并回写更改。应用示例:用户数据库,用户在其中读取和修改用户记录或记录用户活动。在为该记录写入一组更新的字段之前,此工作负载会强制从基础数据存储读取记录。这有效地迫使所有数据存储在接受写入之前先读取基础记录。目前,我们使用随机增量进行写入,而不是使用从当前记录中得出的某个值(例如增加计数器)。因为开始读取似乎是不必要的,所以这会使工作量变得更难遵循。

给TA打赏
共{{data.count}}人
人已打赏
分布式存储架构

TiKV搭建本地镜像并测试benchmark

2021-5-12 22:29:51

分布式综合技术

一个视频带你看清共识策略是如何工作的

2021-5-17 20:57:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索