用 YCSB 压测 DynamoDB

AWS DynamoDB做为公有云的NoSQL 数据库,在不少业务环境和系统都被大量使用。 做为托管服务,传统DBA解脱了调优的压力,可是实际使用过程当中,也须要遵照DynamoDB的游戏规则,才能更好的发挥性能。html

而不少业务场景,在上线前,要评估生产环境的资源分配状况,如DynamoDB WCU/RCU等。那就须要对数据库作相应的压力测试,并根据测试状况,预留相应的资源。git

这个时候,一个有效的,被普遍承认的压力测试软件,才是压力测试的核心。github

这里我选择YCSB,全称为Yahoo! Cloud Serving Benchmark ,是Yahoo公司的一个用来对云服务进行基础测试的工具。数据库

百度一下,YCSB的文章不少,可是针对DynamoDB的,居然只有一篇,并且仍是日文的。网络

无奈,本身研究Github文档吧。app

下面开始流水帐式一步步记录个人按照和测试过程:ide

1. YCSB下载和安装工具

wget https://github.com/brianfrankcooper/YCSB/releases/download/0.15.0/ycsb-0.15.0.tar.gz 
tar xfvz ycsb-0.15.0.tar.gz 
cd ycsb-0.15.0

2.测试是否能够运行oop

bin/ycsb.sh load basic -P workloads/workloada 
bin/ycsb.sh run basic -P workloads/workloada

3.查看关于dynamoDB部分的测试方法和具体配置性能

cd ycsb-0.15.0
cd dynamodb-binding/
cat README.md
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Benchmark
$YCSB_HOME/bin/ycsb load dynamodb -P workloads/workloada -P dynamodb.properties
$YCSB_HOME/bin/ycsb run dynamodb -P workloads/workloada -P dynamodb.properties
# Properties
$DYNAMODB_HOME/conf/dynamodb.properties
$DYNAMODB_HOME/conf/AWSCredentials.properties
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4. 准备dynamoDB的链接信息,

查找终端节点连接:

https://docs.amazonaws.cn/aws/latest/userguide/endpoints-Ningxia.html

$ cat dynamodb/conf/dynamodb.properties
dynamodb.awsCredentialsFile = dynamodb/conf/AWSCredentials.properties
dynamodb.primaryKey = ppktest
dynamodb.endpoint = http://dynamodb.cn-northwest-1.amazonaws.com.cn

5. 准备AWS AK/SK 信息

$ cat dynamodb/conf/AWSCredentials.properties
accessKey = XXXXXXXXXXXXXXXXXXXX
secretKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

6. 建立dynamoDB表:

很简单,可是也耗费我很长时间的一个小坑。dynamoDB的表名,YCSB只能是默认表名usertable,不能够本身取名字(应该是能改的,尝试去找配置文件,可是没有找到)。这也就能理解,为何第4步的dynamodb.properties中,只须要提供的是主键名dynamodb.primaryKey ,而不是表名了。另外,只能设置主键,不能设置sort key,否则也会报错(订正: 能够经过dynamodb.properties中的hash_and_range参数来实现sort key设置):

~~~~~~~~~~~~~~~~表名若是不是usertable,会遇到下面报错~~~~~~~~~~~~~
0    [Thread-1] INFO  com.yahoo.ycsb.db.DynamoDBClient  -dynamodb connection created with http://dynamodb.cn-northwest-1.amazonaws.com.cn
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
185  [Thread-1] ERROR com.yahoo.ycsb.db.DynamoDBClient  -com.amazonaws.AmazonServiceException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 2J7JAI7ME2OCD2DR7VCQQFG6HJVV4KQNSO5AEMVJF66Q9ASUAAJG)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~设置sort key,会遇到下面错误~~~~~~~~~~~~~~~~~~~~~~
Starting test.
0    [Thread-1] INFO  com.yahoo.ycsb.db.DynamoDBClient  -dynamodb connection created with dynamodb.cn-northwest-1.amazonaws.com.cn
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
412  [Thread-1] ERROR com.yahoo.ycsb.db.DynamoDBClient  -com.amazonaws.AmazonServiceException: One or more parameter values were invalid: Missing the key sortkeytest in the item (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: GH5CTDSTDPG99AL0Q1PF962DPJVV4KQNSO5AEMVJF66Q9ASUAAJG)
Error inserting, not retrying any more. number of attempts: 1Insertion Retry Limit: 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

7. 准备压力测试参数文件,YCSB已经准备默认的workloada,workloadb,workloadc.....等常规业务模拟场景,能够直接使用,也能够根据需求更改具体参数

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   Read/update ratio: 95/5
#   Default data size: 1 KB records (10 fields, 100 bytes each, plus key)
#   Request distribution: zipfian
recordcount=10000000
operationcount=100000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=true
readproportion=0.95
updateproportion=0.05
scanproportion=0
insertproportion=0
requestdistribution=zipfian
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

8. 加载数据到DynamoDB

cd ycsb-0.15.0
./bin/ycsb.sh load dynamodb -P workloads/ddbworkload -P dynamodb_home/conf/dynamodb.properties

9. 加载完数据后,表信息

11.png

10. 进行压力测试

./bin/ycsb.sh run dynamodb -P workloads/ddbworkload -P dynamodb_homeonf/dynamodb.properties -threads 100 -target 100

输出结果以下:

[OVERALL], RunTime(ms), 432143## 总共运行时间432秒
[OVERALL], Throughput(ops/sec), 231.40488218020423## 平均吞吐量
[TOTAL_GCS_PS_Scavenge], Count, 180
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 200
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.046280976436040844
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 180
[TOTAL_GC_TIME], Time(ms), 200
[TOTAL_GC_TIME_%], Time(%), 0.046280976436040844
[READ], Operations, 95111## 有95111个更新操做
[READ], AverageLatency(us), 4202.653026463816## 平均响应时间(微秒)
[READ], MinLatency(us), 2478## 最小响应时间(微秒)
[READ], MaxLatency(us), 635391       ## 最大响应时间(微秒)
[READ], 95thPercentileLatency(us), 4239
[READ], 99thPercentileLatency(us), 4863
[READ], Return=OK, 95111 ## 有95111个更新操做返回0(0=成功)
[CLEANUP], Operations, 1
[CLEANUP], AverageLatency(us), 4.0
[CLEANUP], MinLatency(us), 4
[CLEANUP], MaxLatency(us), 4
[CLEANUP], 95thPercentileLatency(us), 4
[CLEANUP], 99thPercentileLatency(us), 4
[UPDATE], Operations, 4889
[UPDATE], AverageLatency(us), 6465.101656780527
[UPDATE], MinLatency(us), 4448
[UPDATE], MaxLatency(us), 1715199
[UPDATE], 95thPercentileLatency(us), 6099
[UPDATE], 99thPercentileLatency(us), 6739
[UPDATE], Return=OK, 4889

11. 在YCSB压测方式以外,若是只是想测试一下RCU/auto scaling,也能够经过scan的方式,在多个窗口同时执行,

(查询usertbale 行数)

aws dynamodb scan --table-name usertable --select "COUNT"
{
"Count": 5529465,
"ScannedCount": 5529465,
"ConsumedCapacity": null
}

瞬间就达到我这个帐号 DynamoDB的8000 limit了. (订正:8000不是limit,每一个dynamoDB默认的RCU和WCU配额分别是40000,我这里是EC2(用来执行table scan命令的机器)的网络出流量达到瓶颈了)

12.png


12. 换个大机型(EC2 用来执行table scan命令),经过多个窗口,同时执行table scan操做,能够看到,轻松达到2W以上 RCU

xx.png


至此,本文结束,YCSB做为简单易用的NoSQL压测工具,总体感受还不错,还有不少参数和细节,须要有时间深刻研究一下。


参考文档:

Github YCSB   https://github.com/brianfrankcooper/YCSB

YCSB dynamodb-autoscaling検証(日文)   https://qiita.com/lawliteqed/items/d5d726e73803b891bb57

DynamoDB官方文档: https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/Introduction.html



小注: 在好友的提醒下,有三点错误,进行订正。没有直接改原文,而是经过括号,标注和解释一下。留有原汁原味的学习历程。

相关文章
相关标签/搜索