本文描述了如何使用Sysbench工具测试托管的RDS性能,分别采用Amazon Aurora 和社区版MySQL进行对比。本实验面向针对AWS有一定使用经验的用户,不再描述基础的VPC、EC2和RDS创建过程。
以下所有测试基于AWS北京Region进行。
一、部署RDS数据库
1、创建MySQL数据库
创建如下型号和配置:
- 类型:Production-MySQL
- 版本:5.7.26
- 规格:m4.4xlarge(16vCPU、122GB)
- 多AZ高可用:启用
- 存储:Provisioned IOPS(SSD),500GB,25000 IOPS
- VPC默认,子网组默认
- 公开访问:否(不允许从互联网直接访问,仅能从EC2登录)
- 安全规则组:事先创建了一个只允许3306端口访问的规则组
- DB参数组:default.mysql5.7
- IAM DB认证:关
- 加密:开
- 监控:启用增强监控
- 日志:选中所有四个日志类型(Audit、Error、General、Slow Query)
- 自动小版本升级:默认
在以上参数基础上,还有一些参数,但是其配置将不影响性能,因此其余参数可使用默认值,这里不在一一解释。
创建完成。
2、创建Aurora数据库
创建如下型号和配置:
- 版本:MySQL-5.7兼容
- 引擎:2.04.6
- 规格:db.r5.4xlarge(16vCPU,128GB)
- 多AZ高可用:启用
- VPC默认,子网组默认
- 公开访问:否(不允许从互联网直接访问,仅能从EC2登录)
- 安全规则组:事先创建了一个只允许3306端口访问的规则组
- DB参数组:default.aurora-mysql5.7
- IAM DB认证:关
- 加密:开
- Failover切换:默认策略(No preference)
- 监控:启用增强监控
- 日志:选中所有四个日志类型(Audit、Error、General、Slow Query)
- 自动小版本升级:默认
至此Aurora创建完成。
二、准备EC2和数据库
1、检查数据库主实例所在的可用区和连接地址
进入RDS界面,点击MySQL实例,可从如下界面看到当前所在可用区为1a,即可用区1。如下截图。
查看Aurora集群地址的方法是点击Aurora集群节点,注意不能点击Writer主节点或Reader备用节点,而是点击Cluster集群节点,然后查看集群地址。如下截图。
查看Aurora主节点所在可用区的方法是,点击Write节点,然后查看其所在的可用区,如下截图。
经检查,本实验的数据的主实例都是在AZ1的。因此我们将从AZ1的EC2发起压力请求。
2、创建EC2虚拟机
创建EC2时候需要注意,性能测试要求发起请求的客户端EC2与被测试的数据库主节点位于同一个可用区,这样可最小化网络延迟。
创建EC2配置如下:
- 操作系统选择Amazon Linux 2
- 型号选择m5.8xlarge(32vCPU,128GB)
- VPC选择默认VPC,子网选择1a(本例中被测试的数据库位于1a)
- 点击展开高级设置,在User data中,选择类型是文本,然后粘贴下如下文本
- 磁盘选择100GB,规格Provisioned IOPS(io1),5000 IOPS
- 安全组选择仅允许22端口登录
配置虚拟机的user data如下:
#! /bin/bash
amazon-linux-extras install epel
yum update -y
yum install sysbench mysql -y
# Enhanced system limits
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF
echo "" > /etc/security/limits.d/20-nproc.conf
cat >> /etc/security/limits.d/20-nproc.conf <<EOF
* soft nofile 65536
* hard nofile 65536
EOF
reboot
创建EC2完成。
请注意,如果您测试的MySQL和Aurora分别位于不同的1a和1b可用区,那么请您重复以上创建EC2过程,再另一个可用区也创建相同的EC2实例,由此保障EC2和被测试数据库都在一个可用区。
3、验证RDS和Aurora的网络和登录
创建完毕后,通过EC2实例登录数据库,确认正常。
连接到MySQL使用如下命令。
mysql -h mysql.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn -uadmin -p1qazxsw2
连接Aurora命令如下。
mysql -h aurora.cluster-cfvonviibzua.rds.cn-north-1.amazonaws.com.cn -uadmin -p1qazxsw2
至此确认数据库连接正常。
4、调整RDS连接上限
登录到数据库内,可以用如下命令确认:
show variables like "%max_prepared_stmt_count%";
例如MySQL上查询结果如下截图。
在Aurora上执行查询也会获得相同的返回参数。为此我们需要调整参数组。
在RDS界面上点击参数组,在右侧会列出当前的参数组。需要注意的是,系统内默认的参数组是不允许修改的,因此请点击新建参数组。由于MySQL和Aurora是两个类型的数据库,因此,请新建两个参数组,分别叫做MySQL-benchmark和Aurora-Benchmark,并为之选择对应的数据库类型。
从参数组列表界面,点击新创建的参数组名字,进入修改界面,在页面上方输入 max_prepared_stmt_count 然后可以自动搜索获得这一参数。在Value值的位置,将其修改为 1048576 ,即本参数在MySQL 5.x系列所能打到的最大值。修改完成后,保存。如下截图。
下一步编辑刚才创建好的MySQL数据库,找到参数组选项,将其从默认的 default.mysql5.7 修改为刚才新创建的 mysql-benchmark 。点击继续按钮。如下截图。
此时配置向导将提示是立刻修改还是等到下一个维护窗口修改。这里选择等待下一个维护窗口修改。
返回数据库界面,选中MySQL数据库,对其执行重启操作。这个参数必须重启才能生效。如下截图。
在重启时候,会提问是否执行Failover切换界面,不要选中这个选项。
等待几分钟后,重启完成。重启后登录到数据库,重新查询参数,可发现新参数已经生效。如下截图。
至此MySQL数据库的参数组修改完成。
接下来对Aurora数据库也执行以上步骤。在创建参数组第一步,Aurora的参数组分为两种,分别是适用于单个节点的参数组,和适用于集群的参数组。这里选择适用于单个节点的参数组。选项如下截图。
搜索stmt参数,完成修改。如下截图。
为Aurora修改参数组需要注意,Aurora的两个节点,可以分别有不同的参数组。因此,要先点击Writer主节点,点击编辑,对其更换参数组。然后再点击Reader节点,更换参数组。更换后,对两个节点分别重启。
至此准备工作完成,即将开始测试。
三、读写混合测试
1、准备读写混合测试数据
事先准备好如下测试脚本,替换脚本中的数据库endpoint、用户名、密码为实际使用的参数。
MySQL数据准备。
sysbench --db-driver=mysql --mysql-host=mysql.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=2 oltp_read_write prepare
Aurora数据准备如下。
sysbench --db-driver=mysql --mysql-host=aurora.cluster-cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=2 oltp_read_write prepare
2、重复读写混合测试
MySQL测试脚本如下。
sysbench --db-driver=mysql --mysql-host=mysql.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=100 --percentile=95 --report-interval=10 oltp_read_write run
将其中的threads=100分别修改为300、600、900、1200、1500进行测试。
Aurora测试脚本如下。
sysbench --db-driver=mysql --mysql-host=aurora.cluster-cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=100 --percentile=95 --report-interval=10 oltp_read_write run
将其中的threads=100分别修改为300、600、900、1200、1500进行测试。
3、读写混合测试数据汇总如下
分别记录每次测试的数据如下。
MySQL结果如下:
项目
100
300
600
900
1200
1500
TPS
3776.22
5284.71
5270.19
5116.61
4984.36
4803.66
平均延迟
26.48
56.75
113.80
175.78
240.57
311.95
P95延迟
37.56
92.42
179.94
277.21
383.33
502.20
表1:MySQL读写混合测试结果。
Aurora结果如下:
项目
100
300
600
900
1200
1500
每秒TPS
5194.91
6941.16
6718.09
6526.82
6517.19
6382.26
平均延迟
19.24
43.21
89.27
137.79
183.93
234.69
P95延迟
26.20
57.87
108.68
161.51
231.53
303.33
表2:Aurora 读写混合测试结果
测试数据整理完毕。
四、纯写入测试
1、准备纯写入测试数据
事先准备好如下测试脚本,替换脚本中的数据库endpoint、用户名、密码为实际使用的参数。
MySQL数据准备。
sysbench --db-driver=mysql --mysql-host=mysql.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=2 oltp_write_only prepare
Aurora数据准备如下。
sysbench --db-driver=mysql --mysql-host=aurora.cluster-cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=2 oltp_write_only prepare
2、重复纯写入测试
MySQL测试脚本如下。
sysbench --db-driver=mysql --mysql-host=mysql.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=100 --percentile=95 --report-interval=10 oltp_write_only run
将其中的threads=100分别修改为300、600、900、1200、1500进行测试。
Aurora测试脚本如下。
sysbench --db-driver=mysql --mysql-host=aurora.cluster-cfvonviibzua.rds.cn-north-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=100000 --tables=20 --events=0 --time=300 --threads=100 --percentile=95 --report-interval=10 oltp_write_only run
将其中的threads=100分别修改为300、600、900、1200、1500进行测试。
3、纯写入测试数据汇总如下
分别记录每次测试的数据如下。
MySQL纯写入测试结果如下:
项目
100
300
600
900
1200
1500
TPS
3341.50
7343.79
10050.29
10565.38
10443.97
9798.42
平均延迟
29.92
40.84
59.67
85.15
114.83
152.99
P95延迟
44.17
78.60
108.68
170.48
253.35
344.08
表3:MySQL 纯写入测试结果
Aurora 纯写入测试结果如下:
项目
100
300
600
900
1200
1500
TPS
8865.80
14560.19
16952.95
17762.39
17458.88
16604.58
Delay
11.28
20.60
35.38
50.64
68.68
90.23
P95
22.28
35.59
56.84
77.19
108.68
144.97
表4:Aurora 纯写入测试结果
测试数据整理完毕。
五、结论
1、数据分析
将以上数据绘制为曲线,且投射在曲线图上。
读写混合测试中,Aurora表现好于MySQL,在负载打到几百线程后,延迟低于MySQL 20%以上,在多线程并发的情况下,95%的延迟都在500ms以内。如下图1和图2。
图1:读写混合场景,TPS曲线,数值越高性能越好
图2:读写混合场景,延迟曲线,数值越低性能越好
在纯写测试中,由于Aurora的底层存储系统想对比MySQL的普通EBS有着巨大的优势,因此从一开始Aurora就获得了比读写测试中更高的TPS,而且远远的将MySQL抛在后边。转折点在900~1000并发,之后继续增加并发数,性能开始下降,TPS降低、延迟升高。但这一转折来的较普通MySQL更晚,能跟好的承担负载。如下图3和图4。
图3:纯写入场景,TPS曲线,数值越高性能越好
图4:纯写入场景,延迟曲线,数值越低性能越好
2、小结
建议在侧重写入的OLTP场景中,使用Aurora数据库,并且对于查询分析类操作,可使用Aurora只读副本分担主节点写入的压力,通过业务层读写分离优化,实现最佳综合性能表现。
全文完。
最后修改于 2020-04-06