暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【译】使用 Amazon Aurora 3 创建索引的零影响

原创 热血青年 2022-06-10
844

原文链接: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]>ALTERwindmills_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 就是您的解决方案,只需正确进行数学运算并保守使用实例资源即可。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论