当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性

举报
GaussDB 数据库 发表于 2021/12/31 17:31:02 2021/12/31
【摘要】 听华为云数据库专家讲解分布式事务奔溃如何安全恢复

任务.jpg

注:本文如没有特殊说明,MySQL指社区版MySQL;binlog指MySQL server日志;redo Log指MySQL InnoDB日志

 

MySQL replication实时同步主库上执行的事务到备库,并且支持一般事务的崩溃恢复安全,这为一般事务的高可用提供了坚实的保障。如果没有此高可用保障,主库崩溃(不能正常恢复场景)后,数据库服务轻则中断几十分钟甚至几小时,重则丢失用户数据。

 

但是当前MySQL所有版本不支持分布式事务的崩溃恢复安全,这严重影响了分布式事务的高可用保障。华为云数据库(包括RDS (for MySQL) GaussDB (for MySQL))解决了这一痛点,支持分布式事务的崩溃恢复安全,极大地提升华为云数据库的可靠性和可用性。

 

接下来我们将逐个讨论MySQL在分布式事务崩溃恢复安全方面的几个常见问题,以及华为云数据库采取了什么解决方案来保证数据的一致性。

(如需了解分布式事务,请参考这里:https://dev.mysql.com/doc/refman/8.0/en/xa.html

 

问题一:

如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog中保存有准备阶段执行的事务,但是InnoDB回滚了准备阶段执行的事务。从而导致MySQL serverInnoDB数据不一致。准备阶段执行的事务会被回放到备库,它获得的所有事务处理过程中使用的锁永远不能被释放。最终导致备库回放需要获得相关锁的其它事务时锁超时失败,复制中断。

 

华为云数据库解决方案

如上图流程所示:

  1. 如果崩溃发生在阶段一,主库重启后,这个分布式事务准备阶段既不在MySQL server中,也不在InnoDB中;
  2. 如果崩溃发生在阶段二,主库重启恢复过程中这个分布式事务准备阶段会被InnoDB回滚掉,最终这个分布式事务准备阶段既不在MySQL server中,也不在 InnoDB
  3. 如果崩溃发生在阶段三,主库重启后,这个分布式事务准备阶段既存在MySQL server中,也存在InnoDB中;

所以,无论崩溃发生在上图中的哪一点,主库重启后,华为云数据库都能保证MySQL serverInnoDB数据的一致性。

 

问题二:

如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog保存有XA COMMIT xid, 但是MySQL InnoDB没有提交这个分布式事务。

  • 如果不重新提交,那么在准备阶段获得的所有事务处理过程中使用的锁永远不能被释放,最终导致主库执行需要获得相关锁的其它事务时锁超时失败
  • 如果重新提交,XA COMMIT xid再次被持久化到binlog备库在回放第二个XA COMMIT xid时抛出“Unknown XID”错误,导致复制中断。

 

华为云数据库解决方案

主库在重启的过程中binlog作为仲裁提交了这个分布式事务准备阶段执行的事务,保证了华为云数据库MySQL serverMySQL InnoDB数据的一致性。

 

问题三:

如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后, binlog保存有XA ROLLBACK xid,但是MySQL InnoDB没有回滚这个分布式事务。

  • 如果不重新回滚,这个分布式事务准备阶段获得的所有事务处理过程中使用的锁永远不能被释放,最终导致主库执行需要获得相关锁的其它事务时锁超时失败
  • 如果重新回滚,XA ROLLBACK xid再次被持久化到binlog备库在回放第二个XA ROLLBACK xid时抛出“Unknown XID”错误,导致复制中断。

 

华为云数据库解决方案

主库在重启的过程中binlog作为仲裁回滚了这个分布式事务准备阶段执行的事务,保证了华为云数据库MySQL serverMySQL InnoDB数据的一致性

 

问题四:

如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog中保存有一阶段提交分布式事务,但是MySQL InnoDB回滚了这个一阶段提分布式事务。从而导致MySQL serverMySQL InnoDB数据不一致。一阶段提交的分布式事务会被回放到备库,最终导致备库数据和主库数据的不一致

 

华为云数据库解决方案

如上图所示:

  1. 如果崩溃发生在阶段一,主库重启后,这个一阶段提交分布式事务既不在MySQL server中,也不在MySQL InnoDB中;
  2. 如果崩溃发生在阶段二,主库重启恢复过程中这个一阶段提交分布式事务会被MySQL InnoDB回滚掉,最终这个分布式事务既不在MySQL server中,也不在MySQL InnoDB中;
  3. 如果崩溃发生在阶段三,主库重启后,这个一阶段提交分布式事务既存在MySQL server中,也存在MySQL InnoDB中;

无论崩溃发生在上图中的哪一点,主库重启后,华为云数据库都能保证MySQL serverMySQL InnoDB数据的一致性。

 

华为云数据库很好地解决了分布式事务崩溃恢复安全的相关问题,极大地提升数据库的可靠性和可用性,提升了用户使用华为云数据库的体验。后续我们会持续在分布式事务方面做更多的优化和解决MySQL可能遇到的问题,也欢迎大家使用华为云数据库分布式事务,体验华为云数据库卓越的可靠性和可用性,期待您的反馈!https://www.huaweicloud.com/product/gaussdb_mysql.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。