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

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.mzph.cn/news/42270.shtml

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

相关文章

Matplotlib数据可视化(六)

目录 1.绘制概率图 2.绘制雷达图 3.绘制流向图 4.绘制极坐标图 5.绘制词云图 1.绘制概率图 from scipy.stats import norm fig,ax plt.subplots() plt.rcParams[font.family] [SimHei] np.random.seed() mu 100 sigma 15 x musigma*np.random.randn(437) num_bins …

【腾讯云 Cloud Studio 实战训练营】在线 IDE 编写 canvas 转换黑白风格头像

关于 Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用Cloud Studio 时无需安装,随时随地打开浏览器就能在线编程。 Cloud Studio 作为在线IDE,包含代码高亮、自动补全、Gi…

C++新经典03--共用体、枚举类型与typedef

共用体 共用体,也叫联合,有时候需要把几种不同类型的变量存放到同一段内存单元,例如,把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同,但它们都从同…

idea 转换为 Maven Project 的方法

选项: Add as Maven Project

通过TightVNC远程访问MacOS

目录 一、下载 TightVNC 下载链接:https://www.tightvnc.com/ 下载后按步骤进行安装,安装完成后安装目录如下: 运行 tvnviewer.exe,输入远程 IP,点击【connect】: 输入密码,点击【OK】后即可远…

Matlab中图例的位置(图例放在图的上方、下方、左方、右方、图外面)等

一、图例默认位置 默认的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圆 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直线 legend([A1,A2],圆形,line)二、通过Location对legend的位置进行改变 变…

企业电子招投标采购系统源码之电子招投标的组成 tbms

​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为…

设计模式-观察者模式(观察者模式的需求衍变过程详解,关于监听的理解)

目录 前言概念你有过这样的问题吗? 详细介绍原理:应用场景: 实现方式:类图代码 问题回答监听,为什么叫监听,具体代码是哪观察者模式的需求衍变过程观察者是为什么是行为型 总结: 前言 在软件设计…

【C++类和对象】类有哪些默认成员函数呢?(下)

文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…

2011年下半年 软件设计师 上午试卷2

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

数据包如何游走于 Iptables 规则之间?

在前文《Linux路由三大件》中,我们提到了 iptables 可以修改数据包的特征从而影响其路由。这个功能无论是传统场景下的 防火墙,还是云原生场景下的 服务路由(k8s service)、网络策略(calico network policy) 等都有依赖。 虽然业…

ceph数据分布

ceph的存储是无主结构,数据分布依赖client来计算,有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设: 第一,pg的数量稳定,可以认为保持不变; 第二, OSD的数量可以增减,OSD的…

基于Java的深圳坂田附近闲置物品交易群管理系统

开发技术:java 开发框架:springmvc、spring、mybatis 数据库:mysql 备注:方便大家将手中的二手闲置物品转让给需要的人,例如大家搬家的时候,有不要的(冰箱、洗衣机、桌子、椅子)等物…

一、进入sql环境,以及sql的查询、新建、删除、使用

1、进入sql环境 》》》mysql -u root -p 》》》输入密码 2、sql语言的分类 3、注意事项: 4、基础操作: (1)查询所有数据库: show databases; 运行结果: (2)创建一个新的数据库&…

CSS练习

CSS练习 工具代码运行结果 工具 HBuilder X 代码 <!DOCTYPE html> <!-- 做一个表格&#xff0c;6行4列实现隔行换色&#xff08;背景色&#xff09;并且第3列文字红色第一个单元格文字大小30px。最后一个单元格文字加粗--> <html><head><meta ch…

初阶C语言-结构体

&#x1f31e; “少年有梦不至于心动&#xff0c;更要付诸行动。” 今天我们一起学习一下结构体的相关内容&#xff01; 结构体 &#x1f388;1.结构体的声明1.1结构的基础知识1.2结构的声明1.3结构成员的类型1.4结构体变量的定义和初始化 &#x1f388;2.结构体成员的访问2.1结…

QT 使用第三方库QtXlsx操作Excel表

1.简介 一直以来&#xff0c;都想学习一下C/C如何操作excel表&#xff0c;在网上调研了一下&#xff0c;觉得使用C/C去操作很麻烦&#xff0c;遂转向QT这边&#xff1b;QT有一个自带的类QAxObject&#xff0c;可以使用他去操作&#xff0c;但随着了解的深入&#xff0c;觉得他…

c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

最长重复子数组(力扣)动态规划 JAVA

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

新宝马M5谍照曝光,侵略感十足,将与奥迪、梅赛德斯-AMG正面竞争

报道称&#xff0c;宝马即将推出全新一代M5&#xff0c;该车的谍照最近再次曝光。早先&#xff0c;宝马 M5 Touring 旅行汽车的赛道测试图片已经在网络上流传开来&#xff0c;预计该车将与奥迪的RS6 Avant和梅赛德斯-AMG E63 Estate展开正面竞争。 从最新曝光的照片来看&#x…