两阶段提交:详解数据库宕机引起的主从不一致问题、redolog与binlog的两阶段提交

news2024/12/22 19:10:52

0、基础知识and问题

        从基础上我们了解:

        (1)redolog作为数据库保证持久化的日志,在update事务提交后就会按一定的策略刷入磁盘中,在刷入后,即使数据库断电宕机,mysql也能从redolog中恢复数据到磁盘中,从而实现持久化。
        (2)同样的,对于binlog,主要用于主从数据库之间的数据同步以及数据库的全数据恢复,常规的步骤是类似的:主库的update过程就会写binlog,提交后,就按照一定的策略刷入磁盘中。紧接着,在主从同步中,通过以下步骤发送给从库,从库通过读取中继日志实现主从的一致性。

       (3)对于undolog,会在开启事务,update更新之前先记录相应的旧值,方便事务的回滚。

问题: 

现在有一个问题:由于RedoLog和BinLog的刷盘过程是相互独立的两个过程,那么在主从同步的过程中,如果发生数据库宕机:如果RedoLog日志或者BinLog日志的其中之一成功刷盘,而另一个没有成功(由于相互独立,这是有可能发生的),那么就会发生以下情况: 

  • 如果在将 redo log 刷入到磁盘之后, MySQL 突然宕机了,而 binlog 还没有来得及写入。            MySQL 重启后,通过 redo log 能将数据字段恢复到新值
            但是 binlog 里面没有记录这条更新语句,在主从架构中,binlog 会被复制到从库,由于 binlog 丢失了这条更新语句,从库的这字段是旧值,与主库的值不一致性
  • 如果在将 binlog 刷入到磁盘之后, MySQL 突然宕机了,而 redo log 还没有来得及写入
            由于 redo log 还没写,崩溃恢复以后这个事务无效,所以数据字段还是旧值
            而 binlog 里面记录了这条更新语句,在主从架构中,binlog 会被复制到从库,从库执行了这条更新语句,那么字段是新值,与主库的值不一致性;

        那么该如何在断电宕机情况下保证主从的一致性呢?
        即 数据库的两阶段提交策略。

1、 两阶段提交的具体过程

         两阶段,就是让redolog分为两阶段提交,因为redolog的操作可以撤销,通过一个MySQL 内部开启一个 XA 事务(注意,这个事务是一个宏观上的大事务,而不是sql语句组成的事务)分两阶段来完成 XA 事务的提交,来保证redolog和binglog两个日志的刷盘,这两个任务的原子性。

        具体来说,redolog的提交,分为了prepare阶段和commit阶段:
        (1)prepare阶段,将redolog的事务状态设为prepare、将事务XID写入redo log,并把redo log持久化到磁盘中

        (2)commit阶段:把事务XID写入binlog,并把binlog刷盘,然后将redo log事务状态设置为commit

         我们发现,实际上这个过程的核心,是通过日志的事务ID来判断是否完成某个步骤的,例如在这样的过程下,如果出现异常,是如何保证双方的一致性呢?

        断电后,在 MySQL 重启后会按顺序扫描 redo log 文件,碰到处于 prepare 状态的 redo log,就拿着 redo log 中的 XID 去 binlog 查看是否存在此 XID:

  • 如果redolog都刷盘失败,那就全都回滚!
  • 如果 binlog 中没有当前内部 XA 事务的 XID,说明虽然redolog 完成刷盘,但是 binlog 还没有刷盘,则回滚整个 XA事务。(因为有undolog,所以可以回滚提交了的redolog)
  • 如果 binlog 中有当前内部 XA 事务的 XID,说明 redolog 和 binlog 都已经完成了刷盘,则提交事务
  • 如果redolog都是commit状态了,那更没问题了!

2、个人思考 

         在学习的过程中我在思考一个问题,为什么两阶段提交,要让redolog分两阶段,而不是让binlog分成两阶段提交呢?
        和同学探讨请教后发现,是因为,两阶段提交的redolog,即使redolog刷盘了,如果binlog没刷盘,我就让两个事情都回滚就好了,对主从数据不会有任何影响。
        但是如果让binlog两阶段提交,如果binlog刷盘成功了、而redolog刷盘失败,由于binlog刷盘一成功就会进行主从复制,从数据库的数据已经被刷盘了,此时虽然redolog失败、我想把整个大事务rollback,但由于已经把binlog同步给从数据库,已然无力回天。
        实在是豁然开朗啊。

 3、两阶段提交的弊端

  • 磁盘 I/O 次数高:对于“双1”配置,每个事务提交都会进行两次 fsync(刷盘),一次是 redo log 刷盘,另一次是 binlog 刷盘。
  • 锁竞争激烈:两阶段提交虽然能够保证「单事务」两个日志的内容一致,但在「多事务」的情况下,却不能保证两者的提交顺序一致,因此,在两阶段提交的流程基础上,还需要加一个锁来保证提交的原子性,从而保证多事务的情况下,两个日志的提交顺序一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7 安装MySQL8.0.33

一、查看 CentOS 版本 要查看当前 CentOS 版本,你可以执行以下命令: cat /etc/centos-release 该命令将显示当前 CentOS 的版本信息,例如: CentOS Linux release 7.9.2009 (Core) 在这个示例中,CentOS 版本为 7.…

Spring Clould 负载均衡 - Ribbon

视频地址:微服务(SpringCloudRabbitMQDockerRedis搜索分布式) Ribbon-负载均衡原理(P14) 具体实现时通过LoaBalanced注解实现,表示RestTemplate要被Ribbon拦截处理 orderservice调用user时候&#xff0c…

【无标题】QT应用编程: QtCreator配置Git版本控制(码云)

QT应用编程: QtCreator配置Git版本控制(码云) 感谢:DS小龙哥的文章,这篇主要参考小龙哥的内容。 https://cloud.tencent.com/developer/article/1930531?areaSource102001.15&traceIdW2mKALltGu5f8-HOI8fsN Qt Creater 自带了git支持。但是一直没…

如何使用CSS实现一个无限滚动效果(Infinite Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现无限滚动效果(Infinite Scroll)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xf…

接口测试及接口抓包常用测试工具和方法?

作为测试领域中不可或缺的一环,接口测试和抓包技术在软件开发过程中扮演着至关重要的角色。不论你是新手还是有一些经验的小伙伴,本篇文章都会为你详细介绍接口测试的基本概念、常用测试工具和实际操作技巧,让你轻松掌握这一技能。 接口测试…

c语言——输出一个整数的所有因数

//输出一个整数的所有因数 #include<stdio.h> #include<stdlib.h> int main() {int number,i;printf("输入整数&#xff1a;");scanf("%d",&number);printf(" %d 的因数有&#xff1a; ",number);for(i1;i<number;i){if(numb…

java八股文面试[java基础]——String StringBuilder StringBuffer

String类型定义&#xff1a; final String 不可以继承 final char [] 不可以修改 String不可变的好处&#xff1a; hash值只需要算一次&#xff0c;当String作为map的key时&#xff0c; 不需要考虑hash改变 天然的线程安全 知识来源&#xff1a; 【基础】String、StringB…

【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)

前言 上篇文章我们介绍了strlen、strcpy、stract这三个函数&#xff0c;接下来我们会学习新的函数&#xff0c;话不多说&#xff0c;让我们直接开始吧 上一篇文章 strcmp 引入&#xff1a; 在进行字符串比较时&#xff0c;不可以直接使用符号&#xff0c; 这是在比较二者的…

LVS-DR模式以及其中ARP问题

目录 LVS_DR LVS_DR数据包流向分析 LVS-DR中ARP问题 问题一 问题二 解决ARP的两个问题的设置方法 LVS-DR特点 LVS-DR优缺点 优点 缺点 LVS-DR集群构建 1.配置负载调度器 2.部署共享存储 3.配置节点服务器 4.测试 LVS 群集 LVS_DR LVS_DR数据包流向分析 客户端…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

《C和指针》读书笔记(第十二章 使用结构和指针)

目录 0 简介1 链表2 单链表2.1 在单链表中插入2.1.1 初次尝试2.1.2 优化插入函数2.1.3 在指定位置插入节点&#xff08;补充&#xff09; 2.2 其他链表操作2.2.1 单链表的创建2.2.2 单链表的删除2.2.2.1 删除指定位置的节点2.2.2.2 删除整个链表 3 双链表3.1 在双链表中插入3.1…

需求吞吐效能提升 65%!这家世界500强如何加速业务转型?

昨日&#xff0c;ONES 受邀参加由中关村智联软件服务业质量创新联盟主办的 TiD 2023 质量竞争力大会。会上&#xff0c;ONES 研发效能改进资深咨询顾问董晓红&#xff0c;发表了主题为《解码大型集团企业研发效能提升关键策略》的演讲。 董晓红在研发管理、研发工具链集成、敏捷…

销售管理七要,阿里生存下来的秘诀

企业销售管理“七要”&#xff1a;阿里巴巴生存下来的秘诀 纯纯的干货&#xff0c;有方法有实践 阿里巴巴靠B2B诚信通生存下来的 叫“中供铁军”&#xff0c;很多身影在O2O大战中出现 趣讲大白话&#xff1a;功夫深&#xff0c;铁棒磨成针 【趣讲信息科技260期】 *************…

LVS负载均衡DR(直接路由)模式

在LVS&#xff08;Linux Virtual Server&#xff09;负载均衡中的DR&#xff08;Direct Routing&#xff09;模式下&#xff0c;数据包的流向如下&#xff1a; 客户端发送请求到负载均衡器&#xff08;LVS&#xff09;的虚拟IP&#xff08;VIP&#xff09;。负载均衡器&#x…

SpringBoot | RestTemplate异常处理器ErrorHandler使用详解

关注wx&#xff1a;CodingTechWork 引言 在代码开发过程中&#xff0c;发现很多地方通过RestTemplate调用了第三方接口&#xff0c;而第三方接口需要根据某些状态码或者异常进行重试调用&#xff0c;此时&#xff0c;要么在每个调用的地方进行异常捕获&#xff0c;然后重试&am…

企业文件数据防泄密软件——「天锐绿盾」透明加密保护防泄密管理软件系统

摘要&#xff1a;本文介绍了一款名为「天锐绿盾」的公司文件加密软件&#xff0c;该软件旨在保护公司重要文件的安全性。通过对软件进行详细分析和测试&#xff0c;我们发现「天锐绿盾」具有强大的加密功能、简便的操作界面和高度的兼容性。本文将详细介绍软件的特点、优势及其…

Mysql存储引擎中InnoDB与Myisam的主要区别

在mysql命令窗口中,输入show engins,可以看到mysql的所有引擎,那么这么多的引擎,我们经常使用到的也就两种,MyISAM和InnoDB,这两种引擎究竟有什么区别呢? 1, 事务处理 innodb 支持事务功能,myisam 不支持。 Myisam 的执行速度更快,性能更好。 2,select ,update ,inse…

Shell 编程基础01

0:目录 1.创建新的虚拟机项目 2.linux常见命令和配置时间同步器 3.文件属性 4.if for while和方法 1.创建新的虚拟机项目 默认下一步到虚拟机命名 默认下一步设置磁盘大小 自定义硬件 删除打印机设置映像地址 启动虚拟机 选择 install centOS 7 选择英文 设置时…

[Flash CS6]使用AIR拓展屏幕

虽然目前没多少人使用Flash了&#xff0c;但还是记录一下 一、工具 Adobe Flash CS6 AIR3.2 For Desktop&#xff08;Flash CS6 自带的&#xff09; 二、设置步骤 1.将舞台改为想要拓展的屏幕尺寸大小&#xff08;以下以3840x1080位例子&#xff09; 2.打开AIR 3.2 for Desk…

鸽王-稚晖君,“远征”A1启程

看到这篇文章的人&#xff0c;想必对野生钢铁侠-稚晖君&#xff0c;都有所了解。作为华为的天才少年&#xff0c;获得了很多的荣誉&#xff0c;作为B站有名的鸽王&#xff0c;在沉浮一段时间后终于要带着新的东西和大家见面了。动态-哔哩哔哩https://b23.tv/Jv7tIjg 众所周知&a…