目前,在系统设计中引入了越来越多的NoSQL产品,例如Redis/ MongoDB/ HBase等,其中性能指标往往会成为权衡不同NoSQL产品的关键因素。对这些产品在性能表现和产品选择上的争论,Ivan碰到不止一次。虽然通过对系统架构原理方面的分析可以大致判断出其在不同读写场景下的表现,但一是对受众有较高的要求,也来的不那么直接。这时候,没有什么比一次性能测试更有说服力。有什么好的性能测试工具呢?这就是今天的主角YCSB。YCSB是Yahoo开源的一套分布式性能测试工具,方便易用,拓展性强。Ivan最近研究HBase二级索引时用它来做性能测试,感觉还是非常顺手的。虽然网上已经有很多YCSB的介绍文章,但用来指导实际操作还是有些不便。Ivan会用两三篇文章来介绍一下YCSB的实际使用。本文是官方文章的译文,选择这篇文章是因为其与具体操作的关系比较紧密,感兴趣的同学可以了解一下。
正文运行workload有六个步骤
安装待测试的数据库系统
选择适当的DB接口层
选择适当的工作负载
选择适当的运行参数(客户端线程数量,目标吞吐等)
加载数据
执行工作负载(workload)
这些步骤描述都假定你运行一个单客户端。这可以满足中小规模集群(10台左右)的测试需要。对于更大规模的集群,你必须在不同的服务器上运行多个客户端来生成足够的负载。类似地,在某些场景下,多客户机加载数据库可能更快。多客户端并行运行的更多细节,可以查看Running a Workload in Parallel
Setp 1.安装待测试的数据库第一步是安装你希望测试的数据库。可能是单机或者集群,依赖于你要测试的配置。
你必须create 或 set up tables/keyspaces/storage buckkets用于存储记录。这些细节对于每个数据库都不同,依赖于希望运行的负载情况。在YCSB客户端运行前,数据表必须被创建,因为客户端自身是不会请求创建数据库表的。这是因为对于某些系统创建表一个手工操作,而对于其他系统,表必须在集群启动前被创建。
workload所依赖的table必须被创建。对于核心负载,YCSB客户端将假定存在一个名为'usertable'的table,且具有灵活的schema:运行时可以根据需要增加列。'usertable'可以被映射为适当的存储容器。例如,在MySQL中,你可以create table,在Cassandra你可以在配置中定义keyspace。数据库接口层(Step 2描述)会收到读写usertable的请求,将其转换为你所指定的实际存储的请求。这意味着你必须提供数据库接口层帮助它理解下层存储的结构。例如,在Cassandra中,你必须定义在keyspace中定义列族column families。这样,必须创建一个列族并命名(例如,你可以使用values)。然后,数据库访问层需要理解指向values列族,或者将字符串“values”设置为一个属性,或者在数据库接口层中硬编码。
数据库接口层是一个可执行的java类,实现read、write、update、delete和scan调用,它由YCSB客户端生成,调用你的数据库API。这个类是com.yahoo.ycsb包下抽象类DB的子类。在运行YCSB客户端时,你要通过命令行指定类名,客户端会动态加载你的接口类。命令行中指定的任何属性或指定的参数文件,将会传递给数据库接口层实例,用于配置该层(例如,告诉它你要测试的数据库主机名hostname)
YCSB客户端自带一个简单的虚拟接口层,com.yahoo.ycsb.BasicDB。这层会把执行的操作通过System.out打印。这可以用于确认客户端在正常运行,用于debug 你的workload。
如何使用YCSB客户端的细节可以查看 Using the Database Libraries。更多实现数据库接口层的细节,可以查看 Adding a Database
你可以使用YCSB命令,直接运行数据库命令。客户端使用DB接口层发送命令给数据库。你可以使用客户端确定DB层运行正常,你的数据库正确安装,DB层可以连接到数据库等等。它为大量的数据库提供了命令行接口,可以用于检验数据库的数据。运行命令行:
$ ./bin/ycsb shell basic
help
Commands:
read key [field1 field2 ...] - Read a record
scan key recordcount [field1 field2 ...] - Scan starting at key
insert key name1=value1 [name2=value2 ...] - Insert a new record
update key name1=value1 [name2=value2 ...] - Update a record
delete key - Delete a record
table [tablename] - Get or [set] the name of the table
quit - Quit
工作负载定义了在loading阶段将被加载进数据库的数据,在transaction阶段在数据集上执行的操作。
典型的工作负载包括以下内容:
Workload java class(com.yahoo.ycsb.Workload的子类)
Parameter file(Java Properties格式)