两阶段提交:详解数据库宕机引起的主从不一致问题、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…

winform 设置画刷半透明

使用solidBrush新建画刷,定义画刷的颜色为透明色 Brush b new SolidBrush(Color.FromArgb(50, Color.Green)); 这里的50是透明度的设置,范围从0-255; 0:无颜色 255:不透明 转:c# 设置Brush 画刷 透明_solidcolorbrush 透明色_…

git-fatal: No url found for submodule path ‘packages/libary‘ in .gitmodules

文章目录 前言一、git submodule功能使用二、错误信息:三、解决方法:四、.gitmodules配置文件:总结 前言 最近在做vue项目,因为项目比较复杂,把功能拆分成很多子模块,我们使用Git的submodule功能。遇到错误…

使用libvncserver库快速搭建VNC服务端

文章目录 VNC是什么libvncserver的优点和缺点构建libvncserver使用libvncserver搭建VNCServerX11模拟鼠标键盘操作libvncserver中处理鼠标键盘消息 VNC是什么 VNC(Virtual Network Computing)是一种使用远程帧缓冲协议(RFB)的屏幕分享及远程操作软件。VNC的服务端可以通过RFP协…

Linux开机启动程序添加root权限

Linux添加开机启动程序 Debain、Ubuntu系列Linux开机之后会执行/etc/rc.local文件中的命令,所以,如果是想添加登陆用户所具有权限的操作,可以在文件中exit 0之前添加开机自动执行的脚本命令。或者将执行脚本的权限修改为当前登录用户具有执行…

基于R语言APSIM模型进阶应用与参数优化、批量模拟

随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

moodle单点登陆

在moodle/login添加sso.php <?phprequire(../config.php); require_once(lib.php);if($_SERVER[REQUEST_METHOD]==GET){$tokenId=$_GET[tokenId]; }else{$tokenId="fail";

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

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

idea 转换为 Maven Project 的方法

选项&#xff1a; Add as Maven Project

通过TightVNC远程访问MacOS

目录 一、下载 TightVNC 下载链接&#xff1a;https://www.tightvnc.com/ 下载后按步骤进行安装&#xff0c;安装完成后安装目录如下&#xff1a; 运行 tvnviewer.exe&#xff0c;输入远程 IP&#xff0c;点击【connect】&#xff1a; 输入密码&#xff0c;点击【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

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

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

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

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

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

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

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

如何为你的表单添加一个反选功能

原始代码 无标题文档 <form id"form1" name"form1" method"post" action""><table width"50%" border"1" cellspacing"0" cellpadding"0"><tr><td bgcolor"#9999…

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

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

ceph数据分布

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

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

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