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

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

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

 

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

 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 5 关注
  • OnlyOffice
    4 引用 • 18 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    945 引用 • 1460 回帖 • 1 关注
  • 持续集成

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

    15 引用 • 7 回帖 • 4 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 3 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 5 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 549 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • Solidity

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

    3 引用 • 18 回帖 • 425 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    422 引用 • 1250 回帖 • 598 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 204 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 179 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 29 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    409 引用 • 3581 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    87 引用 • 122 回帖 • 626 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 753 关注