架构杂谈《四》

架构杂谈《四》

分布式一致性协议

一、引言

  在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些个副本会放在不同的物理机上,为了对用户提供正确的数据,我们需要保证这些放在不同物理机上的副本是一致的。为了解决这种分布式一致性问题,提出了很多经典的协议和算法,比较著名的是 两阶段提交协议和三阶段提交协议。

二、两阶段提交协议

  两阶段提交协议把分布式事务分为两个阶段,一个是准备阶段,一个是提交阶段。准备阶段和提交阶段都是由事务管理器发起的,两阶段提交协议的流程如下:

  1、准备阶段:事务管理器向资源管理器发起指令,资源管理器评估自己的状态,如果资源管理器评估指令可以完成。则会写redo或者undo日志,然后锁定资源,执行操作,但是并不会提交

  2、提交阶段:如果每个资源管理器明确返回准备成功,事务管理器向资源管理器发起提交指令,资源管理器提交资源变更的事务,释放锁定的资源;如果任何一个资源管理明确返回准备失败,则事务管理器向资源管理器发起中止指令,资源管理器取消已经变更的事务,执行undo日志。释放锁定的资源。

  

(两阶段提交协议的成功场景图)

  我们从上图中可以看到,两阶段提交协议在准备阶段锁定资源,这是一个重量级的操作,能保证强一致性,但是实现起来复杂、成本大、不够灵活。还有以下缺点:

     (1)、阻塞:对于任何一次指令都必须收到明确的响应,才会继续进行下一步,否则处于阻塞状态,占用的资源一直被锁定,不会释放

     (2)、单点故障:如果事务管理器(协调者)挂了(宕机),资源管理器(参与者)没有事务管理器(协调者)指挥,则会一直阻塞,尽管可以通过选举新的协调者替代原有的协调者,但是参与者接收后也宕机,则新上任的协调者无法处理这种情况

     (3)、脑裂:协调者发送提交指令,有的参与者接收到并执行了事务,有的参与者没有接收到事务就没有执行事务,多个参与者之间是不一致的。

  上面的问题虽然很少发生,但每次发生都需要人工参与,没有自动化解决方案,因此两阶段提交协议在正常情况下能保证系统的强一致性,但在出现异常的情况下,需要人工干预解决,因此可用性不够好,其实这也符合CAP协议的一致性和可用性不能兼得的原理。

三、三阶段提交协议

  三阶段提交协议是两阶段提交协议的改进版本,它通过超时机制解决了阻塞的问题,并且把两个阶段增加为三个阶段。

  1、询问阶段:事务管理器(协调者)询问参与者(资源管理器)是否可以完成指令,参与者只需要回答是或者否,而不需要做真正的操作,这个阶段超时会导致中止。

  2、准备阶段:如果在询问阶段所有参与者都返回可以执行操作,则协调者向参与者发送预执行请求,然后参与者写 redo 和 undo 日志,执行操作但不提交操作;如果在询问阶段任何一个参与者返回不能执行操作的结果,则协调者向参与者发送中止请求,这里的逻辑和两阶段提交协议的准备阶段是相似的。

  3、提交阶段:如果每个参与者在准备阶段返回准备成功,则协调者向参与者发送提交指令,参与者提交资源变更的事务,释放锁定的资源;如果任何一个参与者返回准备失败,则协调者向参与者发送中止指令,参与者自己取消已经变更的事务,执行 undo 日志,释放锁定的资源。这里的逻辑和两阶段提交协议的提交阶段一致。

    

 (三阶段提交协议的成功场景图)

  三阶段提交协议与两阶段提交协议主要有以下不同点:

    (1)、增加了一个询问阶段,询问阶段可以确保尽可能早地发现无法执行操作而需要中止的行为,但是它并不能发现所有的这种行为,只会减少这种情况的发生。

    (2)、在准备阶段以后,协调者和参与者执行的任务中都增加了超时,一旦超时,则协调者和参与者都会继续提交事务,默认为成功。

  三阶段提交协议与两阶段提交协议相比,具有以上的优点,但是一旦发生超时,系统仍然会发生不一致,只不过这种情况很少见。好处是不会阻塞和永远锁定资源。  

四、TCC

  两阶段和三阶段提交协议,在遇到极端情况时,系统会产生阻塞或者不一致的问题,需要人干预解决。两阶段及三阶段方案中都包含多个参与者、多个阶段实现一个事务。实现事务,性能也是一个很大的问题。因此在互联网的高并发系统中,很少有使用两阶段提交和三阶段提交协议的场景。

  后来有人提出了TCC协议,TCC协议将一个任务分成 Try、Confirm、Cancel 三个步骤。正常的流程会先执行 Try,如果执行没有问题,则再执行 Confirm,如果执行过程中出现了异常。则执行操作的逆操作 Cancel。从正常的流程上讲。这还是一个两阶段提交协议,但在执行出现异常后有一定的自我修复能力,如果任何参与者出现了问题,则协调者通过执行操作的逆操作来 Cancel 之前的操作。达到最终一致性状态。

  可以看出,从时序上讲,如果遇到机端情况,则TCC会有很多问题,如:如果在取消时一些参与者收到指令,而另一些参与者没有收到指令,则整个系统任然是不一致的,对于这种复杂的情况,系统首先会通过补偿的方式尝试自我修复,如果系统无法修复。还是需要人工干预解决。

  从 TCC 的逻辑上来看,它是简化版的三阶段提交协议,解决了两阶段提交协议的阻塞问题,但还是没有解决极端情况下出现的问题(不一致和脑裂问题)。然而,TCC 通过自动化补偿手段,将需要人工处理的不一致问题降到最低,也是一种很有用的解决方案。

(TCC 协议的使用场景)

说明:

  1、参考书籍:《分布式服务架构:原理、设计与实战》

  2、如有不合适的地方请反馈。综合后更改。

(0)

相关推荐

  • 微服务分布式事务之LCN、TCC特点、事务补偿机制缘由以及设计重点

    在亿级流量架构之分布式事务解决方案对比中, 已经简单阐明了从本机事务到分布式事务的演变过程, 文章的最后简单说明了TCC事务, 这儿将会深入了解TCC事务是原理, 以及理论支持, 最后会用Demo举例 ...

  • “双十一”节前别去大厂面试,有读者最终挂在了分布式事务上,哭惨~

    本文提纲如下前言单数据源事务 & 多数据源事务常见分布式事务解决方案2.1. 分布式事务模型2.2. 二将军问题和幂等性2.3. 两阶段提交(2PC) & 三阶段提交(3PC)方案2. ...

  • 分布式事务概述及大厂通用解决方案

    分布式事务概述及大厂通用解决方案

  • 分布式缓存的选择

    架构师(JiaGouX) 我们都是架构师! 架构未来,你来不来? XA/二阶段提交 基于XA协议的二阶段提交 所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器 ...

  • 分布式之系统底层原理(上)

    作者:allanpan,腾讯 IEG 高级后台工程师 导言 分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持.本文从分布式事务这个概念切入,尝试对分布式 ...

  • 架构杂谈《五》

    保证最终一致性的模式 在大规模.高并发服务化系统中,一个功能被拆分成多个具有功能单一的子功能,一个流程会有多个系统的多个单一功能的服务组合实现,如果使用两阶段提交协议和三阶段提交协议,确实能解决系统间 ...

  • 架构杂谈《八》

    Docker 架构 一.Docker 引擎的三大组件 1)Docker 后台服务(Docker Daemon):是长时间运行在后台的守护进程,是Docker的核心服务,可以通过命令dockerd与它进 ...

  • 架构杂谈《七》

    架构杂谈<七> 容器VS虚拟机 一.什么是虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 虚拟系统通过生 ...

  • 架构杂谈《六》

    架构杂谈<六> 超时处理模式 在服务化或者微服务架构里,传统的整体应用拆分成多个职责单一的微服务,微服务之间通过某种网络通信协议互相通信和交互,完成特定的功能,然而由于网络通信的不稳定,在 ...

  • 产品思维学习(三)--产品设计的五个层面_兴国-为梦想而战-CSDN博客_产品架构的五个层面

    产品思维学习(三)--产品设计的五个层面 今天的读书会很碰巧有一位同学分享<用户体验要素-以用户为中心的产品设计>这本书.里面讲述了用户体验要素的五个层面:战略层,范围层,结构层,框架层, ...

  • 理想化学校课程架构的五个维度

    我同意并且一直坚持这样的一个主张或观点:课程是学校教育的最重要的载体,课程应该是学校的最重要的产品. 一所学校的课程状况决定着这所学校教育所能具有的"教育空间"的状况. 学校课程的 ...

  • 占星不求人(杂谈五)古典占星看健康 -by 古典占星老师吴奕清

    Hi,我是Yitsing吴奕清,清清玄学俱乐部和卓越之门权贵(风投)组织创始人及主理人. 酷爱研究古典占星学.八字.紫微斗数.面相.阴阳宅风水当中的格局论断,致力于使用命理学当中的格局论断技法来进行风 ...

  • 杂谈[五]

       这是六一先生制定的____  预测师的准则: [一]要有高深的学问,没有学历的限制,但必须博通五术,有真正的才学, [二]要有宗教家的慈悲,不可敛财骗色,必须本着慈悲心劝人行善布施, [三]要有 ...

  • 股权三部曲:股权分配+股权架构+股权激励 五张系统知识图足够!

    <股权设计风险管理手册><公司股权架构图解手册><股权激励实战手册> 北青博雅 股权三部曲 常坷           pingpu