本文描述了如何使用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 |
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 |
测试数据整理完毕。
四、纯写入测试
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 |
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 |
测试数据整理完毕。
五、结论
1、数据分析
将以上数据绘制为曲线,且投射在曲线图上。
读写混合测试中,Aurora表现好于MySQL,在负载打到几百线程后,延迟低于MySQL 20%以上,在多线程并发的情况下,95%的延迟都在500ms以内。如下图1和图2。
在纯写测试中,由于Aurora的底层存储系统想对比MySQL的普通EBS有着巨大的优势,因此从一开始Aurora就获得了比读写测试中更高的TPS,而且远远的将MySQL抛在后边。转折点在900~1000并发,之后继续增加并发数,性能开始下降,TPS降低、延迟升高。但这一转折来的较普通MySQL更晚,能跟好的承担负载。如下图3和图4。
2、小结
建议在侧重写入的OLTP场景中,使用Aurora数据库,并且对于查询分析类操作,可使用Aurora只读副本分担主节点写入的压力,通过业务层读写分离优化,实现最佳综合性能表现。
全文完。