大数据、云计算时代,出现了许多新型的数据库类型,包括 Redis、MongoDB、HBase、Couchbase等,各个数据库的特性各有千秋,而且如今各家云厂商提供数据库时,都会进行一些调优,比较起来比较困难。
这时就需要一套标准化的测试工具,为此雅虎在 2010 年推出了 YCSB(Yahoo Cloud Serving Benchmark,雅虎云服务基准测试),提供了一个标准的框架和工作负载集,可以便捷地比较不同「键-值」存储数据库和云数据库的性能。YCSB 于 2010 年开源,目前的版本为 0.13.0 。
1. YCSB 简介
YCSB 项目包括两大块:
- YCSB 客户端:可扩展的工作负载生成器。
- 核心负载:一组工作负载场景,由负载生成器执行。
我们可以利用 YCSB 对多个数据库运行基准测试,然后进行对比。一般来说,可以在相同硬件配置下安装多个数据库,每个数据库执行相同的工作负载。之后就可对测试结果进行数据可视化,判断哪个的性能更好。
2. YCSB 安装
安装过程比较简单,官方已经提供了编译好的二进制包。
curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.12.0/ycsb-0.12.0.tar.gz
tar xfvz ycsb-0.12.0.tar.gz
cd ycsb-0.12.0
执行方式如下:
./bin/ycsb
3. 运行工作负载
运行工作负载,主要包括六个步骤:
- 设置好测试数据库系统
- 选择合适的数据库接口层
- 选择合适的工作负载
- 选择合适的运行时参数(客户端线程数、目标吞吐量等)
- 加载数据
- 执行工作负载
接下来,简要介绍一下每步操作中可能要注意的一些问题。
3.1 设置好测试数据库系统
数据库系统可以配置在单机或集群上,根据希望测试的场景选择。在 YCSB 客户端运行之前,必须先创建数据表,因为客户端不会主动请求创建。
3.2 选择合适的数据库接口层
数据库接口层是一个 Java 类,负责执行 YCSB 客户端生成的读取、插入、更新、删除等操作,并转换成对应数据库的 API 情况。运行 YCSB 客户端时,需要在客户端指定类的名称,而且命令行中设置的参数会传入到数据库实例中。
3.3 选择合适的工作负载
工作负载定义了加载阶段(loading phase)中要加载到数据库中的数据,以及事务阶段(transaction phase)阶段将要对数据集执行的操作。
通常,工作负载由以下组件构成:
- Workload 类(com.yahoo.ycsb.Workload的子类)
- 参数文件
3.4 选择合适的运行时参数
选择好工作负载类型后,可能还需要指定一些具体的参数,这些参数可以通过命令行提供,包括:
- threads:客户端线程数。客户单默认执行单一工作者进程。
- target:每秒操作的目标数量。客户端默认会执行尽可能多的操作。
- status:对于运行时间较长的负载,客户端定期报告状态很有必要,可以显示测试是否崩溃。
3.5 加载数据
工作负载有两个执行阶段:加载阶段(定义插入哪些数据),以及事务阶段(定义对数据集执行哪些操作)。如需加载数据,要运行 YCSB 客户端,让其执行加载阶段。
例如,加载标准的测试数据集:
$ ./bin/ycsb load basic -P workloads/workloada
3.6 执行工作负载
加载好数据之后,即可执行工作负载。具体来说,就是让客户端运行工作负载的事务部分,示例命令如下:
$ ./bin/ycsb run basic -P workloads/workloada -P large.dat -s > transactions.dat
这里,我们通过 run
参数,让客户端运行事务部分,而不是数据加载部分。
以上是使用 YCSB 对数据库系统进行基准测试的大致流程。针对具体的数据库系统,具体的测试步骤如何进行,我们在后续的文章中再来介绍。