三阶段提交协议的起源及其优缺点

本贴最后更新于 3035 天前,其中的信息可能已经东海扬尘

有木有看我上一篇博文 XA与两阶段提交?木有的赶紧先去看看先把,那是基础,最近也对其做了更新,自认为变得更logic及清晰了,看没看过都回去翻翻把~

 

上文提到 两阶段提交存在一个缺陷——若 某个回复了可提交的 资源管理器A 与 “其他一部分资源管理者B 及 协调者C" 失联 后,无法判定自身应该提交或者回滚,只能阻塞等待,完全失去了可用性。

三阶段提交协议的设计就是为了解决这个问题的。它同时兼顾了 强一致性 以及 可用性。但不同于两阶段提交,三阶段解决这个问题假设的模型中,是不存在网络断开但主机还存活着的这种情况,一旦失联,那么就是对方主机挂了。

其实这个就是CAP理论中,保留C以及A 不考虑P的情况(CAP理论可以看我的另外一篇博文——如何理解CAP)。

正因为它没有考虑断网的情况,以及需要三次来回的网络请求,耗时长 所以在现实世界中极少使用,仅仅只是供大家学习参考其 加入约定解决问题 的思想

 

三阶段提交是将两阶段提交中的第二阶段拆成了两部分 preCommit 以及 doCommit变成 一共三个阶段 以及为 这些不同的阶段加上一些约定来实现 一致性及可用性的,具体如下图:

https://upload.wikimedia.org/wikipedia/en/3/39/Three-phase_commit_diagram.png

 

 

之前在两阶段提交中已经论证过了,除了 【资源管理器A 与 “其他一部分资源管理者B 及 协调者C" 失联 后,无法判定自身应该提交或者回滚】 的情况外,都可保证一致性,因此在这不对其他情况作讨论,只分析这一种情况。

在变成三阶段提交后, A 与”协调者C及参与者B“失联(这里限定为B及C挂了)可分为两种情况:

A收到了preCommit的请求,A没有收到preCommit的请求。

一) A没有收到preCommit的请求

这时其他机器都挂了,根据约定,我就超时回滚啦。

但为什么回滚没有问题呢?这个时候其他主机虽然挂了,但是其必然处于没有提交的状态。理由如下:

1、A并没有回复ACK给协调者,协调者不可能发送提交命令给其他资源管理者

2、其他资源管理者B即使处于preCommit状态,也不会存在因为超时进行提交而A不知道的情况。因为超时提交前,B可以进行广播——我要进行超时提交啦,通知完所有机器后再执行提交!这个通知必然会告知正在运行的A。

当其他机器根据write-ahead-log恢复到本事务时,可以跟当前的正在运作的机器询问这一笔事务应该回滚或者提交,从而恢复到一致状态。(什么?这个时候只剩下你孤零零一个?好吧,你就只能阻塞等待了,这估计不是三阶段提交协议的讨论范围了....)

因此当A没有收到preCommit请求与其他机器失联进行回滚是可以保证一致性的。

 

二)A收到了preCommit的请求

这时其他机器都挂了,根据约定,A就执行提交操作了。

要执行COMMIT就要确定其他资源管理器都没有执行rollback操作,这个根据条件能推断出来么?

1、协调者有可能发送ROLLBACK指令么?

不可能。因为根据我们的设定。网络绝对畅通。只要发送过ROLLBACK指令,存活的A一定可以收到。(什么?发给其他资源管理者后,其他资源管理者执行回滚操作后 跟协调者一起挂了?好吧,这种情况也是可以破的....其他资源管理者回滚前再广播一次回滚请求即可...A这样就肯定能收到这个回滚请求了)

 2、其他没有收到preCommit请求的机器会不会在挂了之前就达到超时限制,自行回滚了?

机器可以在回滚前向所有人,包括A。因此不存在 A没有收到回滚通知 而超时提交的情况。

当其他宕机机器根据write-ahead-log恢复到本事务时,可以跟当前的正在运作的机器询问这一笔事务应该回滚或者提交,从而恢复到一致状态。

 

综上,三阶段提交在 不考虑网络断开的情况下,解决了一致性及可用性的问题。

 

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 266 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 692 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 563 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 250 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 656 关注
  • OnlyOffice
    4 引用 • 28 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 287 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 9 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 628 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖
  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖 • 2 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 398 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 19 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 3 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1746 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 3 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 5 关注