原文链接:https://www.percona.com/blog/zero-impact-on-index-creation-with-amazon-aurora-3/
作者:Marco Tusa
在 2021 年最后一个季度,AWS 发布了 Aurora 第 3 版。这个新版本使 Aurora 与最新的 MySQL 8 版本保持一致,移植了 MySQL 8 以前版本的许多优势。
虽然这为 Aurora 带来了许多有趣的新功能,但我们将在这里介绍的是查看 DDL 在使用 ONLINE 选项时的行为方式,与 MySQL 8 标准和 Group Replication 中发生的情况进行快速比较。
CREATE TABLE `windmills_test` (
`id` bigint NOT NULL AUTO_INCREMENT,
`uuid` char(36) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`millid` smallint NOT NULL,
`kwatts_s` int NOT NULL,
`date` date NOT NULL,
`location` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`active` tinyint NOT NULL DEFAULT '1',
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`strrecordtype` char(3) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_millid` (`millid`,`active`),
KEY `IDX_active` (`id`,`active`),
KEY `kuuid_x` (`uuid`),
KEY `millid_x` (`millid`),
KEY `active_x` (`active`),
KEY `idx_1` (`uuid`,`active`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC
执行的命令:
Connection 1:
ALTER TABLE windmills_test ADD INDEX idx_1 (`uuid`,`active`), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE windmills_test drop INDEX idx_1, ALGORITHM=INPLACE;
Connection 2:
while [ 1 = 1 ];do da=$(date +'%s.%3N');mysql --defaults-file=./my.cnf -D windmills_large -e "insert into windmills_test select null,uuid,millid,kwatts_s,date,location,active,time,strrecordtype from windmills4 limit 1;" -e "select count(*) from windmills_large.windmills_test;" > /dev/null;db=$(date +'%s.%3N'); echo "$(echo "($db - $da)"|bc)";sleep 1;done
Connection 3:
while [ 1 = 1 ];do da=$(date +'%s.%3N');mysql --defaults-file=./my.cnf -D windmills_large -e "insert into windmills3 select null,uuid,millid,kwatts_s,date,location,active,time,strrecordtype from windmills4 limit 1;" -e "select count(*) from windmills_large.windmills_test;" > /dev/null;db=$(date +'%s.%3N'); echo "$(echo "($db - $da)"|bc)";sleep 1;done
Connections 4:
while [ 1 = 1 ];do echo "$(date +'%T.%3N')";mysql --defaults-file=./my.cnf -h <secondary aurora instance> -D windmills_large -e "show full processlist;"|egrep -i -e "(windmills_test|windmills_large
操作:
1) 从连接开始插入
2) 在其他节点上的连接 4 – 5 中启动命令
3) 执行: DC1-1(root@localhost) [windmills_large]>ALTER 表 windmills_test 添加索引idx_1 (uuid,active), ALGORITHM=INPLACE, LOCK=NONE;
我想要捕捉的是执行创建索引的常见操作的操作影响。我期望的是,在执行声明为“ONLINE”的操作(例如创建索引以及节点之间的数据一致性)时,不会产生任何影响。
让我们看看发生了什么…
结果
在同一表中运行插入时,执行更改:
mysql> ALTER TABLE windmills_test ADD INDEX idx_1 (`uuid`,`active`), ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (16.51 sec)
Records: 0 Duplicates: 0 Warnings: 0
它不会停止同一表或 Aurora 实例中任何其他表中的操作。
我们只能确定最小的性能影响:
[root@ip-10-0-0-11 tmp]# while [ 1 = 1 ];do da=$(date +'%s.%3N');mysql --defaults-file=./my.cnf -D windmills_large -e "insert into windmills_test select null,uuid,millid,kwatts_s,date,location,active,time,strrecordtype from windmills4 limit 1;" -e "select count(*) from windmills_large.windmills_test;" > /dev/null;db=$(date +'%s.%3N'); echo "$(echo "($db - $da)"|bc)";sleep 1;done
.347
.283
.278
.297
.291
.317
.686 ← start
<Snip>
.512 ← end
.278
.284
.279
辅助节点完全不受影响,这是因为 Aurora 在存储级别管理数据复制,没有从中继日志应用这样的东西,就像我们在标准MySQL异步或使用组复制复制复制的数据中所做的那样。
结果是,在 Aurora 3 中,我们可以执行零影响索引(或任何其他 ONLINE/INSTANT)操作,通过此操作,包括在其他实例中复制的数据以实现高可用性。
如果我们将其与组复制进行比较:
Time on hold for insert for altering table ~0.217 sec ~0 sec
Time on hold for insert for another table ~0.211 sec ~0 sec
但是,请记住,具有组复制的MySQL仍然需要在辅助数据库上应用数据。这意味着如果更改需要 10 个小时来构建索引,则辅助节点将与源不对齐大约 10 个小时。
使用 Aurora 3 或 Percona XtraDB Cluster (PXC),当 Source 完成操作时,更改将存在。
那么PXC呢?好吧,我们有一个不同的场景:
Time on hold for insert for altering table ~120 sec ~0 sec
Time on hold for insert for another table ~25 sec ~0 sec
在执行 Alter 操作时,我们将产生更大的影响,但数据将同时位于所有节点上,从而在集群中保持高水平的一致性。
结论
Aurora并不适合所有用途,但是它有一些非常好的方面,就像我们刚刚看到的一样。标准MySQL和Aurora之间的区别不在于持有/锁定(又名操作影响),而在于HA方面。如果我的数据/结构与源同时出现在所有辅助数据库上,我会觉得比等待好很多。
这就是为什么在这种情况下,如果您能够负担得起锁定时间,PXC是更好的选择。如果没有,那么 Aurora 3 就是您的解决方案,只需正确进行数学运算并保守使用实例资源即可。




