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

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

有木有看我上一篇博文 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恢复到本事务时,可以跟当前的正在运作的机器询问这一笔事务应该回滚或者提交,从而恢复到一致状态。

 

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

 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 53 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 437 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7932 引用 • 36284 回帖 • 169 关注
  • abitmean

    有点意思就行了

    30 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 541 关注
  • Kubernetes

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

    110 引用 • 54 回帖 • 3 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 383 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 237 关注
  • CAP

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

    11 引用 • 5 回帖 • 606 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 3 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 337 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖 • 1 关注
  • danl
    128 关注
  • 运维

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

    148 引用 • 257 回帖
  • 生活

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

    230 引用 • 1454 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 533 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 53 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 465 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 2 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖