关于程序员:当MySQL执行XA事务时遭遇崩溃且看华为云如何保障数据一致性

8次阅读

共计 2246 个字符,预计需要花费 6 分钟才能阅读完成。

注:本文如没有非凡阐明,MySQL 指社区版 MySQL;binlog 指 MySQL server 日志;redo Log 指 MySQL InnoDB 日志

MySQL replication 实时同步主库上执行的事务到备库,并且反对个别事务的解体复原平安,这为个别事务的高可用提供了松软的保障。如果没有此高可用保障,主库解体(不能失常复原场景)后,数据库服务轻则中断几十分钟甚至几小时,重则失落用户数据。

然而以后 MySQL 所有版本不反对分布式事务的解体复原平安,这重大影响了分布式事务的高可用保障。华为云数据库(包含 RDS (for MySQL) 和 GaussDB (for MySQL))解决了这一痛点,反对分布式事务的解体复原平安,极大地晋升华为云数据库的可靠性和可用性。

接下来咱们将一一探讨 MySQL 在分布式事务解体复原平安方面的几个常见问题,以及华为云数据库采取了什么解决方案来保证数据的一致性。

问题一

如上图所示:如果解体产生在危险区间段内的任意一点,主库重启后,binlog 中保留有筹备阶段执行的事务,然而 InnoDB 回滚了筹备阶段执行的事务。从而导致 MySQL server 和 InnoDB 数据不统一。筹备阶段执行的事务会被回放到备库,它取得的所有事务处理过程中应用的锁永远不能被开释。最终导致备库回放须要取得相干锁的其它事务时锁超时失败,复制中断。

华为云数据库解决方案

如上图流程所示:

  • 如果解体产生在阶段一,主库重启后,这个分布式事务筹备阶段既不在 MySQL server 中,也不在 InnoDB 中;
  • 如果解体产生在阶段二,主库重启复原过程中这个分布式事务筹备阶段会被 InnoDB 回滚掉,最终这个分布式事务筹备阶段既不在 MySQL server 中,也不在 InnoDB;
  • 如果解体产生在阶段三,主库重启后,这个分布式事务筹备阶段既存在 MySQL server 中,也存在 InnoDB 中;

所以,无论解体产生在上图中的哪一点,主库重启后,华为云数据库都能保障 MySQL server 和 InnoDB 数据的一致性。

问题二

如上图所示:如果解体产生在危险区间段内的任意一点,主库重启后,binlog 保留有 XA COMMIT xid, 然而 MySQL InnoDB 没有提交这个分布式事务。

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

华为云数据库解决方案

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

问题三

如上图所示:如果解体产生在危险区间段内的任意一点,主库重启后,binlog 保留有 XA ROLLBACK xid,然而 MySQL InnoDB 没有回滚这个分布式事务。

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

华为云数据库解决方案

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

问题四

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

华为云数据库解决方案

如上图所示:

  • 如果解体产生在阶段一,主库重启后,这个一阶段提交分布式事务既不在 MySQL server 中,也不在 MySQL InnoDB 中;
  • 如果解体产生在阶段二,主库重启复原过程中这个一阶段提交分布式事务会被 MySQL InnoDB 回滚掉,最终这个分布式事务既不在 MySQL server 中,也不在 MySQL InnoDB 中;
  • 如果解体产生在阶段三,主库重启后,这个一阶段提交分布式事务既存在 MySQL server 中,也存在 MySQL InnoDB 中;

无论解体产生在上图中的哪一点,主库重启后,华为云数据库都能保障 MySQL server 和 MySQL InnoDB 数据的一致性。

华为云数据库很好地解决了分布式事务解体复原平安的相干问题,极大地晋升数据库的可靠性和可用性,晋升了用户应用华为云数据库的体验。

后续咱们会继续在分布式事务方面做更多的优化和解决 MySQL 可能遇到的问题,也欢送大家应用华为云数据库分布式事务,体验华为云数据库卓越的可靠性和可用性,期待您的反馈!

本文作者
华为云数据库内核高级技术专家,领有十多年 MySQL 内核研发教训,目前在华为云数据库团队研发华为云数据库(RDS for MySQL 和 GaussDB(for MySQL))内核个性和服务化个性,修复华为云数据库现网问题;曾在官网 MySQL 团队研发 MySQL 内核个性和修复 MySQL 内核问题九年多,尤其善于 MySQL Replication。

【重磅举荐】华为云数据库特惠流动

本文由华为云公布

正文完
 0