前言
本文主要指导用户如何测试云Cassandra,以及给出一些我们基准测试的结果。随着内核&云环境不断优化,基准测试结果可能不能代表最优的性能,会不时更新。如果你需要评估业务需要多大规模的Cassandra实例,可以依照本文提供的测试方法做一些基本测试。当然最好的方式还是模拟业务在实例上实际跑一下,这比任何外部测试工具都准确。
测试工具
使用业内标准测试工具YCSB 0.15.0(当前最新release版本)https://github.com/brianfrankcooper/YCSB/tree/0.15.0/cassandra
测试环境
测试直接购买云Cassandra进行测试。
网络:VPC内网,客户端与服务器同地域同可用区实例规模:1个DC,3节点实例容量:单节点400G SSD云盘(容量会适当影响性能)压测客户端: ecs.c6.2xlarge(8核16G)实例规格:当前云Cassandra支持的所有规格
测试负载说明
因为不同业务负载不同(每行字段数,每行数据量等),能达到的吞吐&延迟效果也不同。本文使用YCSB默认的workloada进行测试。用户可以自行调整YCSB参数达到最匹配业务的效果。大部分Cassandra相关测试参数也是默认,详见文档:https://github.com/brianfrankcooper/YCSB/tree/0.15.0/cassandra
主要参数
每行10字段 (默认)
每行1k (默认)
读 : 写 = 95 : 5
读写一致性级别:ONE(默认)
2副本 (因为是云盘,所以使用2副本)
压测线程:根据规格动态调节,具体见测试结果
数据量(recordcount):也就是导入多少行数据,根据规格动态调节,具体见测试结果
压测操作次数(operationcount):压测操作次数和数据量一致
需要注意的是调整一致性级别会影响性能,用户可以根据实际业务情况自行调整。
测试步骤
1. 创建测试表
# cn-shanghai-g 替换成你购买的实例具体的 数据中心ID(DC Name), 在控制台可以找到
create keyspace ycsb WITH replication = {'class': 'NetworkTopologyStrategy', 'cn-shanghai-g': 2};
create table ycsb.usertable (y_id varchar primary key, field0 varchar, field1 varchar, field2 varchar, field3 varchar, field4 varchar, field5 varchar, field6 varchar, field7 varchar, field8 varchar, field9 varchar);
2. 安装测试工具
wget https://github.com/brianfrankcooper/YCSB/releases/download/0.15.0/ycsb-cassandra-binding-0.15.0.tar.gz
tar -zxf ycsb-cassandra-binding-0.15.0.tar.gz
3. 编辑workloads/workloada
加入下面3行
hosts=cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com #数据库连接点,控制台可查到
cassandra.username=cassandra #此账号需要有权限读写ycsb keyspace
cassandra.password=123456 #密码忘记可以控制台修改
4. 数据准备阶段(纯写入测试)
nohup ./bin/ycsb load cassandra2-cql -threads $THREAD_COUNT -P workloads/workloada -s > $LOG_FILE 2>&1 &
此测试结果可以观测写入吞吐上限。要想测试最大吞吐,得不断增大$THREAD_COUNT看吞吐是否有增加,同时压测客户端的规格也不能太小。
5. 压测阶段(读写混合测试)
nohup ./bin/ycsb run cassandra2-cql -threads $THREAD_COUNT -P workloads/workloada -s > $LOG_FILE 2>&1 &
此测试结果可以观测读写混合性能情况。
测试结果
测试结果仅供参考,不同负载情况下延迟吞吐效果也不同。用户可以根据上文所述方法,尝试用不同参数,不同的压力,更大数据量(更长时间)去得到更符合业务情况的测试结果。注意客户端规格也会影响测试结果,不要用共享型。
测试结果解释
Load:数据准备阶段(纯写入测试)。
Run:压测阶段(读写混合测试)。
OPS:每秒操作次数,也就是整个阶段的吞吐。
WAVG:写平均延迟,单位:微秒。
RAVG:读平均延迟,单位:微秒。
RP999:99.9%分位读延迟,单位:微秒。
线程:100/100,表示数据准备阶段YCSB测试线程/压测阶段YCSB测试线程。
压测阶段分两组,一组满负载,一组正常负载。
CPU 80% 负载
规格 | 线程 | 数据量(万行) | Load OPS | Load WAVG | Run OPS | Run WAVG | Run RAVG | Run RP95 | Run RP99 | Run RP999 |
---|---|---|---|---|---|---|---|---|---|---|
4核8G | 100/100 | 1600 | 32277 | 3071 | 29745 | 2846 | 3363 | 7795 | 23039 | 43999 |
CPU 60% 负载
规格 | 线程 | 数据量(万行) | Load OPS | Load WAVG | Run OPS | Run WAVG | Run RAVG | Run RP95 | Run RP99 | Run RP999 |
---|---|---|---|---|---|---|---|---|---|---|
4核8G | 100/16 | 1600 | 32063 | 3093 | 16721 | 514 | 974 | 1879 | 3047 | 28063 |
本文只列了SSD云盘结果。因为高效云盘也拥有不错的IOPS,在数据规模&实例规格较小的情况下,差距不明显(磁盘不是瓶颈),不具备参考价值。用户可以根据实际业务情况,模拟相对真实的负载,实际测试一下。业务侧实际能达到的效果还应结合业务应用实现,比如Java实现的应用可能客户端侧本身GC就会影响延迟。