YCSB(Yahoo! Cloud Serving Benchmark)是一个基于Couchbase Server的性能评估工具。以下是使用YCSB进行基准测试的步骤:
首先
在之前的一篇文章(「NoSQL数据库基准测试介绍:MongoDB、Cassandra和Couchbase」)中,我介绍了Altros公司进行的NoSQL数据库基准测试结果。
在本文中,我们将重点介绍Altros公司使用的Yahoo!云服务基准测试(YCSB),并介绍了在Couchbase服务器上实施该测试所采取的步骤。
性別在受教育中的影響是本論文的核心主題。
在Brian F. Cooper等作者发表的论文《使用YCSB评估云服务系统》中,以下数据库作为研究对象。
-
- PNUTS
-
- BigTable
-
- HBase
-
- Cassandra
- Sharded MySQL
此外,您可以在下列Github库中找到用于执行的源代码等内容。
https://github.com/brianfrankcooper/YCSB
基准测试情景
在Altros公司的基准测试中的使用范围。
在Altros公司的基准测试中,他们定义并执行了一个独特的工作负载,其中只使用了YCSB定义的A(更新密集型工作负载)和E(短范围)工作负载。
查询1:页面分页(通过OFFSET和LIMIT进行过滤)
为了展示经过过滤处理的交易列表,假设是用于财务应用的,需要在服务器端实现分页功能的页面。
查询2:连接(表连接)
为了针对电子商务应用程序,客户使用的各种产品和服务进行一系列报告的查询。
提前的结论
一般来说,使用基准测试的内容(例如数据执行内容,使用API的执行方法)而将其视为黑匣子是没有意义的(无法适用于实际业务)。根据Altros公司的判断(认为需要执行除了YCSB之外的工作负载),我们可以理解到YCSB最初的目标与当前的NoSQL技术和使用范围之间存在差距是合适的。
总之,可以认为在引用数据库的原论文中,与表连接等处理不被重视作为关键用例。特别是对于MongoDB和Couchbase Server这样的面向文档的数据库,进行基准测试时考虑像Altros公司这样的因素是重要的。
进一步说,应该考虑基准测试时实际应用需求并与NoSQL(包括NewRDB在内)以及关系数据库放在同一起跑线上进行比较,这是我目前个人关注的内容。
因此,下一章的内容只具有次要意义,但为了记录执行的内容和共享注意事项,我将记下来。
在Couchbase Server上执行YCSB
利用环境 – Utilize the environment.
源代码
这次,我们不是使用上述原始存储库,而是使用由Couchbase Labs从中分叉出的下面管理的存储库进行执行验证。
https://github.com/couchbaselabs/YCSB 的网址。
README中的”开始”部分列出了使用已编译的执行文件集来执行的步骤。但是,如果使用该文件,由于包含了旧版Couchbase客户端库(由于此原因导致的错误,在我们的尝试中,需要进行库的替换)。因此,下面我们将介绍从源代码中编译的方法。
执行环境
在AWS的”t2.medium”类型的EC2实例上,使用”RHEL-8.2.0_HVM-20200423-x86_64-0-Hourly2-GP2″ AMI部署了Couchbase 6.6环境,搭建成一个节点的集群。只启用了Couchbase的Data、Query和Index服务。
为了编译和运行,我们需要适当地安装Python2(在ycsb命令中称为python的符号链接)、Java8、maven、git等。
准备运行Couchbase
创建一个名为”default”的默认存储桶,并创建一个具有对该存储桶访问权限的同名用户(default)。为了进行简单的执行确认,向该存储桶创建了以下主索引。 (原本应该创建与执行查询相关的次要索引)
CREATE PRIMALY INDEX default_primary ON default
编译
您可以通过以下方式来指定客户端并进行编译。
$ mvn -pl com.yahoo.ycsb:couchbase2-binding -am clean package
数据输入
通过指定load子命令,将数据输入。
bin/ycsb load couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-39.us-east-2.compute.internal -s -P workloads/workloada
执行工作负载
通过指定run子命令来执行工作负载。
调整选项以成功完成处理。请参考下文中的”注意事项”章节。
工作量A
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -s -P workloads/workloada
工作量B
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -s -P workloads/workloadb
工作量 C
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -p couchbase.kv=false -s -P workloads/workloadc
工作量 D
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -p couchbase.kv=false -s -P workloads/workloadd -p couchbase.upsert=true
工作量 E
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -p couchbase.kv=false -s -P workloads/workloade -p couchbase.upsert=true
工作量 F
$ bin/ycsb run couchbase2 -p couchbase.password=password -p couchbase.host=ip-10-0-0-148.us-east-2.compute.internal -s -P workloads/workloadf
请注意。
Couchbase Server提供了一种名为N1QL的查询语言,它是对SQL在JSON操作上进行扩展的查询语言。作为对标准SQL的支持,N1QL还支持INSERT语句。然而,在开发过程中,使用用户界面工具(如命令行)来构建包含JSON数据的VALUES子句的N1QL INSERT语句,然后通过查询服务执行这个查询,对于在实际应用程序中插入数据来说是多此一举的(除了一种情况,即在不获取JSON数据到应用程序的情况下,直接在数据库中创建新数据使用”INSERT~SELECT”语句的情况)。
在涉及到YCSB的相关内容时,Couchbase客户端为YCSB提供了一个名为couchbase.kv的参数。kv表示”键-值”,通过启用此参数,”变更操作也将通过N1QL执行(在进行数据更新操作时,还将使用N1QL)”。
“变更操作(数据更新)”可以简单地说,相当于SQL的UPDATE。在Couchbase的情况下,当通过键(文档ID)来定位文档时,无需执行N1QL查询(服务API),可以通过使用数据服务(API)来部分更新文档(还存在可以一次对多个文档执行相同更新操作的API,类似于可以在SQL查询中执行的操作)。
在这里,麻烦的是,当在数据库世界中提到“变异”时,不仅包括更新、删除等操作,还包括插入操作。但是,在使用YSCB的Couchbase客户端进行重要的A、B、F负载的数据写入场景中,如果指定了-p couchbase.kv=true选项,则插入操作会导致以下错误。
Caused by: com.couchbase.client.core.CouchbaseException: N1qlQuery Error - {"msg":"syntax error: invalid quoted string - at \"6;h61f93 %!](MISSING)c!?j>4h(L11O/%!N(MISSING)--8>?3 !5r!4n.$` 8:<^\\'&&4-=| Y9$[u:Pg\\'\\e=Ec2W{5X+\\'23\\\"f>E#5M#)S1:L{&#$6 t.\"","code":3000}
YCSB中使用的数据是随机字符,并且没有进行SQL转义处理,因此导致了这样的结果。严格来说,应该对值进行转义,或者在INSERT操作中禁用-p couchbase.kv=true选项,或者使用预编译语句将值作为参数指定,但由于没有预料到会使用这种情况,因此未进行任何适应措施而在运行时留下了矛盾之处。
作为例外,Workload D和E使用了INSERT语句,但是采用了预编译语句实现(推测这是为了这些工作负载而引入couchbase.kv选项的原因)。然而,在可以执行基于KV的操作(不需要通过文档值进行搜索,仅需依赖键值进行操作)的场景下,我仍认为使用N1QL查询进行基准测试是具有误导性的。
请提供相关信息
YCSB用于NoSQL基准测试,第1部分。
在YCSB上进行NoSQL基准测试,第2部分。
这个库整理了使用上述库时的指令参数、负载文件配置内容、结果输出的阅读方法等方面的有益指南,发布于2013年。
基准测试工具 YCSB 注意事项
2015年发布。包括Redis和Cassandra的实例示范。
我用YCSB对DynamoDB进行了测试。
发布于2015年。
YCSB的概述和对Cassandra的基准测试
2016年发布,包括基准测试场景表。
使用YCSB向GridDB连接器试试看。
2017年公布
用YCSB (Yahoo Cloud Serving Benchmark)测试In-Memory数据库VoltDB的性能
2019年5月公布。介绍了如何使用不包含在brianfrankcooper的存储库中的数据库(Volt DB客户端已于2019年9月添加到存储库)。