分布式一致性协议

1 两阶段提交协议(2PC)

1.1 两阶段提交协议

两阶段提交协议,简称 2PC(2 Prepare Commit),是比较常用的解决分布式事务问题的方式,要么所 有参与进程都提交事务,要么都取消事务,即实现 ACID 中的原子性(A)的常用手段。

分布式事务: 事务提供一种操作本地数据库的不可分割的一系列操作 “要么什么都不做,要么做全 套(All or Nothing)”的机制,而分布式事务就是为了操作不同数据库的不可分割的一系列操作 “要 么什么都不做,要么做全套(All or Nothing)”的机制

image-20230403164338971

1.2 2PC 执行流程

1.2.1 成功执行事务事务提交流程

image-20230403164410602

阶段一:

  • 事务询问

    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

  • 执行事务 (写本地的 Undo/Redo 日志)

  • 各参与者向协调者反馈事务询问的响应

阶段二:

  • 发送提交请求:

    协调者向所有参与者发出 commit 请求。

  • 事务提交:

    参与者收到 commit 请求后,会正式执行事务提交操作,并在完成提交之后释放整个事务执行期间占用的事务资源。

  • 反馈事务提交结果:

    参与者在完成事务提交之后,向协调者发送 Ack 信息。

  • 完成事务:

    协调者接收到所有参与者反馈的 Ack 信息后,完成事务。

1.2.2 中断事务流程

假如任何一个参与者向协调者反馈了 No 响应,或者在等待超时之后,协调者尚无法接收到所有参 与者的反馈响应,那么就会中断事务

image-20230403164705583

阶段一:

  • 事务询问

    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

  • 执行事务 (写本地的 Undo/Redo 日志)

  • 各参与者向协调者反馈事务询问的响应
    阶段二:

  • 发送回滚请求:
    协调者向所有参与者发出 Rollback 请求。

  • 事务回滚:
    参与者接收到 Rollback 请求后,会利用其在阶段一中记录的 Undo 信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。

  • 反馈事务回滚结果:

    参与者在完成事务回滚之后,向协调者发送 Ack 信息。

  • 中断事务:
    协调者接收到所有参与者反馈的 Ack 信息后,完成事务中断。

1.3 2PC 优点缺点

  1. 优点

    原理简单

  2. 缺点

    • 同步阻塞

      在二阶段提交的执行过程中,所有参与该事务操作的逻辑都处于阻塞状态,即当参与者占有公共资源时,其他节点访问公共资源会处于阻塞状态

    • 单点问题

      若协调器出现问题,那么整个二阶段提交流程将无法运转,若协调者是在阶段二中出现问题时,那么其他参与者将会一直处于锁定事务资源的状态中,而无法继续完成事务操作

    • 数据不一致

      在阶段二中,执行事务提交的时候,当协调者向所有的参与者发送 Commit 请求之后,发生了局部网络异常或者是协调者在尚未发送完 Commit 请求之前自身发生了崩溃,导致最终只有部分参与者收到了 Commit 请求,于是会出现数据不一致的现象。

    • 太过保守

      在进行事务提交询问的过程中,参与者出现故障而导致协调者始终无法获取到所有参与者的响应信息的话,此时协调者只能依靠自身的超时机制来判断是否需要中断事务,这样的策略过于保守,即没有完善的容错机制,任意一个结点的失败都会导致整个事务的失败。

2 三阶段提交协议(3PC)

三阶段提交协议出现背景:一致性协议中设计出了二阶段提交协议(2PC),但是 2PC 设计中还存 在缺陷,于是就有了三阶段提交协议,这便是 3PC 的诞生背景。

2.1 三阶段提交协议

3PC,全称 “three phase commit”,是 2PC 的改进版,将 2PC 的 “提交事务请求” 过程一分为二,共 形成了由CanCommitPreCommitdoCommit三个阶段组成的事务处理协议。

三阶段提交协议

三阶段提交升级点(基于二阶段):

  • 三阶段提交协议引入了超时机制。
  • 在第一阶段和第二阶段中,引入了一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

简单讲:就是除了引入超时机制之外,3PC 把 2PC 的准备阶段再次一分为二,这样三阶段提交就有 CanCommitPreCommitDoCommit三个阶段。

2.2 三个阶段详解

2.2.1 第一阶段(CanCommit 阶段)

类似于 2PC 的准备(第一)阶段。协调者向参与者发送 CanCommit 请求,参与者如果可以提交就返回 Yes 响应,否则返回 No 响应。

  • 事务询问

    协调者向参与者发送 CanCommit 请求。询问是否可以执行事务提交操作。然后开始等待参与 者的响应。

  • 响应反馈:

    参与者接到 CanCommit 请求之后,正常情况下, 如果其自身认为可以顺利执行事务,则返回 Yes 响应,并进入预备状态。 否则反馈 No

2.2.2 第二阶段(PreCommit 阶段)

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

  • Yes

(1).发送预提交请求: 协调者向参与者发送 PreCommit 请求,并进入 Prepared 阶段。

(2).事务预提交: 参与者接收到 PreCommit 请求后,会执行事务操作,并将 undo 和 redo 信息记录 到事务日志中。 (3).响应反馈: 如果参与者成功的执行了事务操作,则返回 ACK 响应,同时开始等待最终指令。

  • NO

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

(1).发送中断请求: 协调者向所有参与者发送 abort 请求。

(2).中断事务: 参与者收到来自协调者的 abort 请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断

2.2.3 第三阶段(doCommit 阶段)

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

  • 执行成功

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

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

    (3).响应反馈: 事务提交完之后,向协调者发送 ACK 响应。

    (4).完成事务: 协调者接收到所有参与者的 ACK 响应之后,完成事务。

  • 中断事务

    (1).发送中断请求: 协调者向所有参与者发送 abort 请求

    (2).事务回滚: 参与者接收到 abort 请求之后,利用其在阶段二记录的 undo 信息来执行事务的回滚操作, 并在完成回滚之后释放所有的事务资源。

    (3).反馈结果: 参与者完成事务回滚之后,向协调者发送 ACK 消息

    (4).中断事务: 协调者接收到所有参与者反馈的 ACK 消息之后,执行事务的中断。

2.2.4 注意:一旦进入阶段三,可能会出现 2 种故障:

  • 协调者出现问题

  • 协调者和参与者之间的网络故障

如果出现了任一一种情况,最终都会导致参与者无法收到 doCommit 请求或者 abort 请求,针对 这种情况,参与者都会在等待超时之后,继续进行事务提交

2.3 2PC 对比 3PC

  1. 首先对于协调者和参与者都设置了超时机制(在 2PC 中,只有协调者拥有超时机制,即如果在一定时间内没有收到参与者的消息则默认失败),主要是避免了参与者在长时间无法与协调者节点通讯 (协调者挂掉了)的情况下,无法释放资源的问题,因为参与者自身拥有超时机制会在超时后,自动进行本地 commit 从而进行释放资源。而这种机制也侧面降低了整个事务的阻塞时间和范围。

  2. 通过 CanCommit、PreCommit、DoCommit 三个阶段的设计,相较于 2PC 而言,多设置了一个缓冲阶段保证了在最后提交阶段之前各参与节点的状态是一致的 。

  3. PreCommit 是一个缓冲,保证了在最后提交阶段之前各参与节点的状态是一致的。

    问题:3PC 协议并没有完全解决数据一致问题。

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

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

相关文章

ctfshow web入门 爆破 21-28

web21 刚进去就要求我们登录,这里题目给了我们一个字典,就是这个字典为什么他那么多数字中 就一个字母的密码还不明显吗。 这里我们使用burp拦包,这里没有发现登录的账号密码,但是有一串可疑的字符串,尝试base64解密 这…

Java设计模式 07-装饰者模式

装饰者模式 套娃模式,直接new放构造器里面套 把抽象类聚合到它的子类里 该子类(装饰者)构造抽象类的实现(被装饰者) 一、星巴克咖啡订单项目(咖啡馆) 1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式…

【Spring】2—IOC容器

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍…

教你如何搭建物业-后勤管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍,如何搭建物业-后勤管理。 1.2、应用场景 该应用包含疫情上报、绿化、安保等管理功能。 2、设置方法 2.1、表单搭建 1)新建表单【返区登记】,字段设置如下: 名称类型名称类型姓名单行文本…

静态路由的原理和配置(理论详细实验全面)

第五章:静态路由 目录 第五章:静态路由 5.1路由器的工作原理 5.1.1路由器根据路由表转发数据 5.1.2 路由信息获取的方式 5.2路由选路原则 5.2.1最长匹配原则 5.2.2路由优先级 5.2.3路由度量值 5.3静态路由 5.3.1静态路由实验 5.3.2缺省路由实…

初学对象存储OSS---学习笔记

文章目录前言一、OSS是什么?下面以一个小故事介绍OSS的作用:二、怎么使用OSS1.进入 -----> [阿里云官网](https://www.aliyun.com/)2.点击进入OSS控制台3.获取accessKeyId 和 accessKeySecret4.拿到了accessKeyId 和 accessKeySecret ,就可…

CTP_将C++封装为Python可调用接口

目录 写在前面: 前置准备: step 1 与上期所原始代码对比分析源码 td源码 1 配置属性-》常规-》配置类型 要为 “动态库(.dll)” 2 VC目录 -》包含目录 3 VC目录 -》 库目录 4 链接器-》常规-》附加库目录 5 链接器-》输入-》附加依赖项 vnctp.h 的功…

CTF杂项提纲

CTF的杂项是涉及编码,图片隐写,音频隐写,压缩包分析的方向,本文对MISC的知识点做了一个简单列举 常见编码 ASCII 0-9,48-57 A-Z 65-90 a-z 97-122 URL url编码又叫百分号编码,是统一资源定位的编码方式 base16/…

leetcode每日一题:数组篇(1/2)

😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:每日算法学习 💬个人…

cmake 常用方法自我总结

目录 1. 编译一个库依赖另一个库 2. 把某一个CMakeLists.txt中变量设为整个工程中任意CMakeLists.txt都可以访问 3. 枚举目录下所有匹配文件 4. 拷贝文件 5. 解决方案下分Header Files,Source Files目录 6. 依赖头文件(附加依赖项) 7.…

通过阿里云函数计算解决ChatGPT API的调用问题

ChatGPT系列文章 与其被ChatGPT取代,不如征服ChatGPT,做它的主人! 文章目录ChatGPT系列文章前言命令行部署准备工作两行命令实现部署应用中心部署使用代理访问API总结前言 自2022年11月30日 OpenAI 发布 ChatGPT 以来,虽然时有唱…

算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

动态规划part10121.买卖股票的最佳时机题目描述思路暴力贪心动态规划122.买卖股票的最佳时机II题目描述思路121.买卖股票的最佳时机 题目链接:121.买卖股票的最佳时机 参考:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9…

entos7系统部署网站项目教程【超详细教程】

CentOS 7 系统部署项目教程 本文将介绍如何在 CentOS 7 系统上部署项目。在本教程中,我们将使用 Apache、PHP 和 MySQL 作为我们的主要开发工具。对于初学者来说,这是一个入门级的教程,旨在提供一些基本的概念和工具,以帮助您更好…

实践分享:如何在自己的App 中引入AI 画图

最近AIGC 简直是杀疯了,领导动不动就让我们在APP 里引入大语言模型,引入AI画图……说搞就搞!本期基于最近在app 里引入AI画图小程序的操作,给大家做一波实践分享。 Scribble Diffusion 是一个简单的在线服务,它使用 A…

Kotlin 面向对象(二)

【文字内容源于《疯狂Kotlin讲义》,代码内容原创】 Kotlin 面向对象(一)_桃子不出的博客-CSDN博客 目录 四、隐藏和封装 1、包和导包 2、Kotlin的默认导入 3、使用访问控制符 五、深入构造器 1、主构造器和初始化块 2、次构造器和构…

Redis —缓存常见异常

文章目录缓存雪崩解决办法缓存击穿解决办法缓存穿透缓存穿透的两种常见情况解决办法布隆过滤器工作原理缓存雪崩 大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理&#…

父子组件传值问题

文章目录前言一、问题描述二、问题解决前言 在写毕业设计,涉及了一些前端Vue.js的组件传值知识并出现了相关问题,因此进行记录。 问题 Vue.js的使用不熟练,相关组件、props等掌握不清晰前端代码书写不规范 望指正! 一、问题描述 …

php企业公司员工考勤加班系统

1、系统管理员 负责员工的基本信息管理(包括姓名、工号、所在部门信息的添加、修改和删除)和员工的上下班时间的添加。 公司考勤记录方式为刷上下班卡,卡机自动记录员工上下班时间。我直接跳过这一步,系统管理员每天在员工下班后直…

面试被问到:测试计划和测试方案有什么区别?

面试的时候,很多小伙伴都被面试官问过这个问题 “测试计划和测试方案有什么区别”? 到底有什么区别呢?我们先好好了解下这两个文档。 一、测试计划 1、测试计划是什么? 测试计划是组织管理层面的文件,从组织管理的…

派盘为您的个人数据安家

现如今,我们的生活中有着各种各样的数据。在工作中会有各种文件、邮件;在生活中则有照片和视频等。数据的来源多,时间点不一致且混乱。 数据是否能安全、稳定、长久的存储以及便捷高效的使用对我们来说相当重要。你是否经常出差需要带上电脑或者移动硬盘,想存网盘又怕丢失或…
最新文章