对比两阶段提交,三阶段协议有哪些改进?

本文我们来讨论两阶段提交和三阶段提交协议的过程以及应用。

在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。在关系型数据库中,由于存在事务机制,可以保证每个独立节点上的数据操作满足 ACID。但是,相互独立的节点之间无法准确的知道其他节点中的事务执行情况,所以在分布式的场景下,如果不添加额外的机制,多个节点之间理论上无法达到一致的状态。

在分布式事务中,两阶段和三阶段提交是经典的一致性算法,那么两阶段和三阶段提交的具体流程是怎样的,三阶段提交又是如何改进的呢?

协调者统一调度

在分布式事务的定义中,如果想让分布式部署的多台机器中的数据保持一致性,那么就要保证在所有节点的数据写操作,要么全部都执行,要么全部都不执行。但是,一台机器在执行本地事务的时候无法知道其他机器中本地事务的执行结果,节点并不知道本次事务到底应该 Commit 还是 Rollback。

在前面介绍过的几种一致性算法中,都是通过一个 Leader 进程进行协调,在 2PC(两阶段)和 3PC(三阶段)中也是一样的解决办法。二阶段和三阶段提交协议都是引入了一个协调者的组件来统一调度所有分布式节点的执行,让当前节点知道其他节点的任务执行状态,通过通知和表决的方式,决定执行 Commit 还是 Rollback 操作。

二阶段提交协议

二阶段提交算法的成立是基于以下假设的:

  • 在该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Participants),且节点之间可以进行网络通信;

  • 所有节点都采用预写式日志,日志被写入后被保存在可靠的存储设备上,即使节点损坏也不会导致日志数据的丢失;

  • 所有节点不会永久性损坏,即使损坏后仍然可以恢复。

两阶段提交中的两个阶段,指的是 Commit-request 阶段和 Commit 阶段,两阶段提交的流程如下:

分1.png

提交请求阶段

在提交请求阶段,协调者将通知事务参与者准备提交事务,然后进入表决过程。在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地事务执行成功)或取消(本地事务执行故障),在第一阶段,参与节点并没有进行Commit操作。

提交阶段

在提交阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消这个事务。这个结果的处理和前面基于半数以上投票的一致性算法不同,必须当且仅当所有的参与者同意提交,协调者才会通知各个参与者提交事务,否则协调者将通知各个参与者取消事务。

参与者在接收到协调者发来的消息后将执行对应的操作,也就是本地 Commit 或者 Rollback。

两阶段提交存在的问题

分2.png

两阶段提交协议有几个明显的问题,下面列举如下。

  • 资源被同步阻塞

在执行过程中,所有参与节点都是事务独占状态,当参与者占有公共资源时,那么第三方节点访问公共资源会被阻塞。

  • 协调者可能出现单点故障

一旦协调者发生故障,参与者会一直阻塞下去。

  • 在 Commit 阶段出现数据不一致

在第二阶段中,假设协调者发出了事务 Commit 的通知,但是由于网络问题该通知仅被一部分参与者所收到并执行 Commit,其余的参与者没有收到通知,一直处于阻塞状态,那么,这段时间就产生了数据的不一致性。

三阶段提交协议

为了解决二阶段协议中的同步阻塞等问题,三阶段提交协议在协调者和参与者中都引入了超时机制,并且把两阶段提交协议的第一个阶段拆分成了两步:询问,然后再锁资源,最后真正提交。

三阶段中的 Three Phase 分别为 CanCommit、PreCommit、DoCommit 阶段。

image (30).png

CanCommit 阶段

3PC 的 CanCommit 阶段其实和 2PC 的准备阶段很像。协调者向参与者发送 Can-Commit 请求,参与者如果可以提交就返回 Yes 响应,否则返回 No 响应。

PreCommit 阶段

协调者根据参与者的反应情况来决定是否可以继续事务的 PreCommit 操作。根据响应情况,有以下两种可能。

A. 假如协调者从所有的参与者获得的反馈都是 Yes 响应,那么就会进行事务的预执行:

  • 发送预提交请求,协调者向参与者发送 PreCommit 请求,并进入 Prepared 阶段;

  • 事务预提交,参与者接收到 PreCommit 请求后,会执行事务操作;

  • 响应反馈,如果参与者成功执行了事务操作,则返回 ACK 响应,同时开始等待最终指令。

B. 假如有任何一个参与者向协调者发送了 No 响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就中断事务:

  • 发送中断请求,协调者向所有参与者发送 abort 请求;

  • 中断事务,参与者收到来自协调者的 abort 请求之后,执行事务的中断。

DoCommit 阶段

该阶段进行真正的事务提交,也可以分为以下两种情况。

A. 执行提交

  • 发送提交请求。协调者接收到参与者发送的 ACK 响应后,那么它将从预提交状态进入到提交状态,并向所有参与者发送 doCommit 请求。

  • 事务提交。参与者接收到 doCommit 请求之后,执行正式的事务提交,并在完成事务提交之后释放所有事务资源。

  • 响应反馈。事务提交完之后,向协调者发送 ACK 响应。

  • 完成事务。协调者接收到所有参与者的 ACK 响应之后,完成事务。

B. 中断事务
协调者没有接收到参与者发送的 ACK 响应,可能是因为接受者发送的不是 ACK 响应,也有可能响应超时了,那么就会执行中断事务。

C.超时提交
参与者如果没有收到协调者的通知,超时之后会执行 Commit 操作。

三阶段提交做了哪些改进

引入超时机制

在 2PC 中,只有协调者拥有超时机制,如果在一定时间内没有收到参与者的消息则默认失败,3PC 同时在协调者和参与者中都引入超时机制。

添加预提交阶段

在 2PC 的准备阶段和提交阶段之间,插入一个准备阶段,使 3PC 拥有 CanCommit、PreCommit、DoCommit 三个阶段,PreCommit 是一个缓冲,保证了在最后提交阶段之前各参与节点的状态是一致的。

三阶段提交协议存在的问题

三阶段提交协议同样存在问题,具体表现为,在阶段三中,如果参与者接收到了 PreCommit 消息后,出现了不能与协调者正常通信的问题,在这种情况下,参与者依然会进行事务的提交,这就出现了数据的不一致性。

两阶段和三阶段提交的应用

两阶段提交是一种比较精简的一致性算法/协议,很多关系型数据库都是采用两阶段提交协议来完成分布式事务处理的,典型的比如 MySQL 的 XA 规范。

在事务处理、数据库和计算机网络中,两阶段提交协议提供了分布式设计中的数据一致性的保障,整个事务的参与者要么一致性全部提交成功,要么全部回滚。MySQL Cluster 内部数据的同步就是用的 2PC 协议。

MySQL 的主从复制

在 MySQL 中,二进制日志是 server 层,主要用来做主从复制即时点恢复时使用的;而事务日志(Redo Log)是 InnoDB 存储引擎层,用来保证事务安全的。

在数据库运行中,需要保证 Binlog 和 Redo Log 的一致性,如果顺序不一致, 则意味着 Master-Slave 可能不一致。

在开启 Binlog 后,如何保证 Binlog 和 InnoDB redo 日志的一致性呢?MySQL 使用的就是二阶段提交,内部会自动将普通事务当做一个 XA 事务(内部分布式事务)来处理:

  • Commit 会被自动的分成 Prepare 和 Commit 两个阶段;

  • Binlog 会被当做事务协调者(Transaction Coordinator),Binlog Event 会被当做协调者日志。

关于 XA 规范的具体实现,会在后面的课时中分享。

总结

两阶段和三阶段提交协议是众多分布式算法的基础,本文介绍了两阶段提交和三阶段提交的具体流程,两种协议的区别,以及两阶段提交在 MySQL 主从复制中的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建vue项目:vue脚手架安装、vue-cli安装,vue ui界面创建vue工程(vue2/vue3),安装vue、搭建vue项目开发环境(保姆级教程二)

今天讲解 Windows 如何利用脚手架创建 vue 工程,以及 vue ui 图形化界面搭建 vue 开发环境,这是这个系列的第二章,有什么问题请留言,请点赞收藏!!! 文章目录 1、安装vue-cli脚手架2、vue ui创建…

基于ssm校园美食交流系统论文

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10…

Java聊天

一对一聊天 服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.…

判断两个不重复的list集合是否相等 只比较元素值 不比较顺序

判断两个不重复的list集合是否相等 只比较元素值 不比较顺序 文章目录 🔊前言📕代码🔚运行结果🖊️最后总结 🔊前言 判断两个不重复的list集合是否相等 只比较元素值 不比较顺序 1.如果源为空 现在不为空则不相等2.如…

体育类直播介绍

体育类直播是指以体育比赛为主题的网络直播,包括各种类型的体育赛事,如足球、篮球、网球、赛车等。这种类型的直播内容通常由主播对体育赛事进行实时解说和评论,吸引观众的关注和互动。 在体育类直播中,主播通常会选择自己擅长和…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

Leetcode—714.买卖股票的最佳时机含手续费【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—714.买卖股票的最佳时机含手续费 动态规划算法思想 可参考我的这篇博客 递推实现代码 class Solution { public:int maxProfit(vector<int>& prices, int fee) {int n prices.size();int f[n1][2];memset…

【T+】畅捷通T+软件安装过程中停留在:正在配置产品位置或进度80%位置。

【问题描述】 畅捷通T软件在安装过程中&#xff0c; 进度条一直停留在【正在配置产品…】位置。 【解决方法】 打开【任务管理器】&#xff0c;想必这个如何打开&#xff0c;大家应该都会。 在【进程】中找到【DBConfig.exe】或者【Ufida.T.Tool.SM.DBConfig.exe】进程并结束…

Qt6 QRibbon 一键美化Qt界面

强烈推荐一个 github 项目&#xff1a; https://github.com/gnibuoz/QRibbon 作用&#xff1a; 在几乎不修改任何你自己代码的情况下&#xff0c;一键美化你的 UI 界面。 代码环境&#xff1a;使用 VS2019 编译 Qt6 GUI 程序&#xff0c;继承 QMainWindow 窗口类 一、使用方法 …

Docker的数据卷、数据卷容器,容器互联

数据卷&#xff08;容器与宿主机之间数据共享&#xff09; 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿主机与容器之…

解锁全球潜力:IT外包解决跨国企业海外分支的IT需求

在全球化的浪潮中&#xff0c;跨国企业为了拓展业务辐射面&#xff0c;经常在世界各地设立海外分支。然而&#xff0c;这些分支机构面临着独特的挑战&#xff0c;其中包括解决复杂的IT需求。为了更高效地应对这些挑战&#xff0c;越来越多的企业正在转向IT外包&#xff0c;以便…

Vue配置代理解决跨域

Network的status中报CORS error指在前端&#xff08;Vue.js&#xff09;发起跨域请求时&#xff0c;被服务器拒绝访问的错误 在本地开发环境中&#xff0c;Vue.js 将默认从 http://localhost:8080 启动服务器。如果浏览器访问服务器时使用的 URL 不是该地址&#xff0c;就可能…

计算机网络实用工具之nbtscan

简介 nbscan是一个用于扫描IP网络的NetBIOS名称信息的程序。它向提供范围内的每个地址发送NetBIOS状态查询&#xff0c;并以人类可读的形式列出接收到的信息。对于每个响应的主机&#xff0c;它列出了IP地址、NetBIOS计算机名、登录用户名和MAC地址。 对于安全检查、网络发现…

网络安全威胁——DDoS攻击

DDoS攻击 1. 定义2. DDoS攻击类型2.1 网络层攻击2.2 传输层攻击2.3 应用层攻击 3.DDoS攻击态势特点 1. 定义 分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常见的网络攻击形式。攻击者利用恶意程序对一个或多个目标发起攻击&#xff0c;企图通过大规模互联网流量耗尽…

超越GPT-4!谷歌发布最强多模态大模型—Gemini

12月7日凌晨&#xff0c;谷歌在官网发布了全新最强多模态大模型——Gemini。 据悉&#xff0c;Gemini有Ultra、Pro、Nano三个版本&#xff0c;可自动生成文本、代码、总结内容等&#xff0c;并能理解图片、音频和视频内容。在MMLU、DROP 、HellaSwag、GSM8K等主流评测中&#…

手把手教你新建一个winform项目(史上最全)

文章目录 前言&#xff1a;第1步、打开Microsoft Visual Studio&#xff08;简称vs&#xff09;&#xff0c;本人这里使用的是Visual Studio 2017 专业版&#xff0c;如下图&#xff1a;1.2 Visual Studio Community 2019下载1.3 Visual Studio Community 2019 安装 第2步、点击…

富时中国a50指数准确吗

富时中国A50指数简介 富时中国A50指数&#xff08;FTSE China A50 Index&#xff09;是富时罗素指数有限公司&#xff08;FTSE Russell&#xff09;编制的&#xff0c;旨在反映中国A股市场50家市值较大、流动性较好的公司的股价表现。它是国际上对中国A股市场投资者影响较大的…

python+pytest接口自动化(10)-session会话保持

在接口测试的过程中&#xff0c;经常会遇到有些接口需要在登录的状态下才能请求&#xff0c;否则会提示请登录&#xff0c;那么怎样解决呢&#xff1f; 上一篇文章我们介绍了Cookie绕过登录&#xff0c;其实这就是保持登录状态的方法之一。 另外一种方式则是通过session进行会…

Verilog开源项目——百兆以太网交换机(四)令牌桶管理单元设计

Verilog开源项目——百兆以太网交换机&#xff08;四&#xff09;令牌桶管理单元设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦…

全方位解读SeaTunnel MySQL CDC连接器:实现数据高效同步的强大工具

在当今数据快速增长的时代&#xff0c;实时、高效地同步和处理来自各种数据源的信息成为了企业和开发者面临的重要挑战。 MySQL作为广泛使用的数据库之一&#xff0c;其变更数据捕获&#xff08;CDC&#xff09;功能对于实现这一目标至关重要。在这篇文章中&#xff0c;我们将深…