一、背景
Aurora MySQL 5.6在2023年2月28日End of life,因此需要升级到5.7或者8.0。参考AWS这篇官方文档对5.6结束生命周期的解释。
最简单的升级方式是:直接编辑数据库版本,选择新的版本,然后点击保存。此时数据库会修改版本并重启,升级期间无法接受外部访问。
为了合理申请停机窗口,本文模拟了一个有一定数据量的测试环境,评估升级所需要的时间。
二、用压力机生成数据
1、EC2压力测试机准备和Sysbench安装
部署一台EC2,使用Amazon Linux 2操作系统,并建议配置不低于m5.4xlarge规格,然后安装对应软件:
amazon-linux-extras install epel -y
yum update -y
yum install sysbench mysql -y
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
echo "" > /etc/security/limits.d/20-nproc.conf
cat > /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF
cat > /etc/security/limits.d/20-nproc.conf <<EOF
* soft nofile 65536
* hard nofile 65536
EOF
root
注:以上步骤安装mysql
软件包主要是使用命令行下的mysql客户端软件包,方便后续调试,并不是在压力测试机上启动完整数据库。
最后执行reboot
命令重启EC2,让以上所有内核参数的修改彻底生效。
2、创建特定版本的数据库集群
创建Aurora MySQL数据库,机型选择为r5.xlarge
的数据库,版本选择为Aurroa 1.19.6版本。
执行如下命令可以查看Aurora的版本:
select aurora_version(), @@aurora_version;
3、使用Sysbench填充数据
本实验模拟环境为
- 每个Aurora实例有1个数据库
- 每张表5000000行(约1GB)
- 总计约为2GB/20GB/50GB/100GB/200GB
- 机型为r5.large/r5.4xlarge/r5.8xlarge
在客户机上执行如下命令生成数据:
sysbench --db-driver=mysql \
--mysql-host=aurora-1-19-6.cluster-cfv0psntfqnh.rds.cn-northwest-1.amazonaws.com.cn \
--mysql-port=3306 \
--mysql-user=admin \
--mysql-password=1qazxsw2 \
--mysql-db=lxy \
--table_size=5000000 \
--tables=20 \
--events=0 \
--threads=2 \
oltp_read_write prepare
写在一行上便于复制,命令如下:
sysbench --db-driver=mysql --mysql-host=aurora-1-19-6.cluster-cfv0psntfqnh.rds.cn-northwest-1.amazonaws.com.cn --mysql-port=3306 --mysql-user=admin --mysql-password=1qazxsw2 --mysql-db=lxy --table_size=5000000 --tables=20 --events=0 --threads=2 oltp_read_write prepare
4、查看所有数据库的存储使用量
Sysbench生成数据完毕后,在压力机上使用mysql客户端,登录到Aurora后,执行如下SQL命令查询数据库占用空间情况。
use information_schema;
SELECT
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)',
sum(truncate(DATA_FREE/1024/1024, 2)) as '碎片占用(MB)'
from
information_schema.tables
group by table_schema
order by
sum(data_length) desc, sum(index_length) desc;
以上命令调整格式写在同一行,方便查询。
SELECT table_schema as '数据库', sum(table_rows) as '记录数', sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)', sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)', sum(truncate(DATA_FREE/1024/1024, 2)) as '碎片占用(MB)' from information_schema.tables group by table_schema order by sum(data_length) desc, sum(index_length) desc;
查询结果类似如下截图。
如上截图,可看到这个数据库的使用了磁盘空间是20GB左右。
5、查看特定数据库内所有表的容量
执行如下命令查询某个数据库内各表占用的空间。请替换table_schema
为实际的数据库名。
SELECT
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)',
truncate(DATA_FREE/1024/1024, 2) as '碎片占用(MB)'
from
information_schema.tables
where
table_schema='lxy'
order by
data_length desc, index_length desc;
以上命令调整格式写在同一行,方便查询。
SELECT table_schema as '数据库', table_name as '表名', table_rows as '记录数', truncate(data_length/1024/1024, 2) as '数据容量(MB)', truncate(index_length/1024/1024, 2) as '索引容量(MB)', truncate(DATA_FREE/1024/1024, 2) as '碎片占用(MB)' from information_schema.tables where table_schema='lxy' order by data_length desc, index_length desc;
查询结果类似如下截图。
如上截图,可看到这个数据库的各表使用空间,加起来是20GB左右。
三、Aurora版本升级时间评估
1、查看升级时间的方法
找到要升级的数据库,选择数据库的集群(请不要选取单一实例),然后进入标签页Log & events
菜单。继续向下滚动页面。如下截图。
在Recent events
位置可看到升级相关的事件(也包括快照等)。注意发起时刻并不会立刻记录,因此发起时刻请手工记录,然后后续即可查询日子。如下截图。
2、测试数据量和机型对升级时间的影响
(1) 数据集 2GB
采用db.r5.large(2vCPU/16GB)机型,数据量2GB:
- 10月10日18:07发起1.19.6升级到2.10.2,18:27完成,耗时20分钟。
- 10月13日13:50发起1.19.6升级到2.10.2,14:10完成,耗时20分钟。(上一次同样数据集和机型配置,本次复测)
(2)数据集 20GB
采用db.r5.large(2vCPU/16GB)机型,数据量20GB:
- 10月11日14:25发起1.19.6升级到2.10.2,14:41完成,耗时16分钟。
- 10月13日14:51发起1.19.6升级到2.10.2,15:09完成,耗时18分钟。(上一次同样数据集和机型配置,本次复测)
- 10月11日10:22发起1.22.3升级到2.10.2,10:43完成,耗时21分钟。
- 10月09日21:29发起1.23.0升级到2.10.2,21:48完成,耗时19分钟。
机型提升到db.r5.4xlarge(16vCPU/128GB),数据量20GB保持不变:
- 10月11日21:59发起1.19.6升级到2.10.2,22:20完成,耗时21分钟。
- 10月13日11:57发起1.19.6升级到2.10.2,12:14完成,耗时17分钟。(上一次同样数据集和机型配置,本次复测)
- 10月13日12:16发起1.23.4升级到2.10.2,12:33完成,耗时15分钟。
机型提升到db.r5.8xlarge(32vCPU/256GB),数据量20GB保持不变:
- 10月13日14:10发起1.23.4升级到2.10.2,14:31完成,耗时21分钟。
(3)数据集 50GB
机型提升到db.r5.8xlarge(32vCPU/256GB),数据量50GB:
- 10月13日17:16发起1.23.4升级到2.10.2,17:39完成,耗时23分钟。
(4)数据集 100GB
- 10月14日11:55发起1.23.4升级到2.10.2,12:12完成,耗时17分钟。
(5)数据集 200GB
- 10月14日19:56发起1.23.4升级到2.10.2,20:17完成,耗时19分钟。
升级后的版本信息是:
MySQL [(none)]> select aurora_version(), @@aurora_version;
+------------------+------------------+
| aurora_version() | @@aurora_version |
+------------------+------------------+
| 2.10.2 | 2.10.2 |
+------------------+------------------+
1 row in set (0.00 sec)
MySQL [(none)]>
再次确认数据量是200GB。返回如下结果。
MySQL [(none)]> SELECT table_schema as '数据库', sum(table_rows) as '记录数', sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)', sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)', sum(truncate(DATA_FREE/1024/1024, 2)) as '碎片占用(MB)' from information_schema.tables group by table_schema order by sum(data_length) desc, sum(index_length) desc;
+--------------------+-----------+------------------+------------------+------------------+
| 数据库 | 记录数 | 数据容量(MB) | 索引容量(MB) | 碎片占用(MB) |
+--------------------+-----------+------------------+------------------+------------------+
| lxy | 986563695 | 210493.00 | 4773.76 | 800.00 |
| mysql | 133225 | 4.52 | 2.37 | 1925.00 |
| information_schema | NULL | 0.00 | 0.00 | 0.00 |
| performance_schema | 77026 | 0.00 | 0.00 | 0.00 |
+--------------------+-----------+------------------+------------------+------------------+
4 rows in set (0.01 sec)
- 10月14日19:56发起1.23.4升级到2.10.2,20:17完成,耗时19分钟。
四、结论
通过观察数据量可看到,一般的场景下,从Aurora MySQL 1.xx系列升级到2.10.2,执行原地升级方式,一般需要20分钟左右。生产数据因为复杂度不同,可能需要更长的时间。