RDS性能测试

本文描述了如何使用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结果如下:

项目10030060090012001500
TPS3776.225284.715270.195116.614984.364803.66
平均延迟26.4856.75113.80175.78240.57311.95
P95延迟37.5692.42179.94277.21383.33502.20
表1:MySQL读写混合测试结果。

Aurora结果如下:

项目10030060090012001500
每秒TPS5194.916941.166718.096526.826517.196382.26
平均延迟19.2443.2189.27137.79183.93234.69
P95延迟26.2057.87108.68161.51231.53303.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纯写入测试结果如下:

项目10030060090012001500
TPS3341.507343.7910050.2910565.3810443.979798.42
平均延迟29.9240.8459.6785.15114.83152.99
P95延迟44.1778.60108.68170.48253.35344.08
表3:MySQL 纯写入测试结果

Aurora 纯写入测试结果如下:

项目10030060090012001500
TPS8865.8014560.1916952.9517762.3917458.8816604.58
Delay11.2820.6035.3850.6468.6890.23
P9522.2835.5956.8477.19108.68144.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只读副本分担主节点写入的压力,通过业务层读写分离优化,实现最佳综合性能表现。

全文完。