架构杂谈《四》

架构杂谈《四》

分布式一致性协议

一、引言

  在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(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、如有不合适的地方请反馈。综合后更改。

原文地址:https://www.cnblogs.com/haoxiaozhang/p/11197729.html

时间: 2024-08-02 01:37:17

架构杂谈《四》的相关文章

架构杂谈《十》

架构杂谈<十> 常用开发模式 一.瀑布式开发 瀑布式开发是在1970年提出的软件开发模型,是一种较老的计算机软件开发模式,也是典型的预见性的开发模式,在瀑布式开发中,开发严格遵循预先计划的需求分析.设计.编码.集成.测试.维护的步骤进行,步骤的成果作为衡量进度的方法.瀑布式开发最早强调系统开发应有完整的周期,且必须完成完整地经历每个周期内的每个阶段,并系统化地考量分析所设计的技术.时间与资源等. 瀑布式开发的主要问题是它严格分级导致自由度降低,在需求不明确并且在项目进行过程中可能有变化的情况下

日均百万PV架构第四弹(分布式监控)

应该能更早出的第四弹,被虚拟机错误搅乱,迟迟没有上线,不得已将所有 节点用puppet完成上线,稍后整理第五弹(非你不可自动化)也即将上线 : ) zabbix简介    zabbix是基于Php的开源监控软件    基于多重数据采集 SNMP , Agent , Ping , Port    多重告警通知 Mail , Jabber , SMS    可以完成多种操作平台甚至于设备(route,switch,io)的监控工作    易于定制重用(模板机制,函数),甚至于二次开发    告警及时

GPS部标平台的架构设计(四)-百度地图设计

部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控软件用的都是mapx.mapxtrem.acrgis之类的,使用的都是本地地图.不仅要购买正版地图,还要购买价格不菲的地图引擎license,服务器版的部署的时候,还要绑定到服务器ID上,现在这种开发方式已被抛弃.现在的百度地图.谷歌地图提供的SDK接口丰富,开发方便,系统稳定,大家都用的很爽. 在

大型网站技术架构(四)--网站的高性能架构

大型网站技术架构(一)--大型网站架构演化 大型网站技术架构(二)--架构模式 大型网站技术架构(三)--架构核心要素 网站性能是客观的指标,可以具体体现到响应时间.吞吐量.并发数.性能计数器等技术指标. 1.性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间,指从发出请求到最后收到响应数据所需要的时间.如下列出了系统常用的操作响应时间表. 操作 响应时间 打开一个网站 几秒 数据库查询一条记录(有索引) 十几毫秒 机械磁盘一次寻址定位 4毫秒 从机械磁盘顺序读取1M数据 2毫秒 从S

UML的基础元件之架构元件(四)

 Structural Things An artifact is a physical and replaceable part of a system that contains physical information ("bits"). In a system, you'll encounter different kinds of deployment artifacts, such as source code files, executables, and scrip

架构杂谈《九》

架构杂谈<九> 微服务与轻量级通信机制 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间胡亮协调.互相配合,为用户提供最终价值.在微服务架构中,服务与服务之间通信时,通常是通过轻量级的通信机制,实现彼此间的互通互联.互相协作.所谓轻量级通信机制,通常是指与语言无关.与平台无关的这类协议.通过轻量级通信机制,使服务与服务之间的协作变得简单.标准化. 1.同步通信与异步通信 1.1概述 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务.因此,微服务架构本质

IFC数据模式架构的四个概念层详解说明

IFC模型体系结构由四个层次构成,从下到上依次是 资源层(Resource Layer).核心层(Core Layer).交互层(Interoperability Layer).领域层(Domain Layer).每层中都包含一系列的信息描述模块,并且遵守一个规则:每个层次只能引用同层次和下层的信息资源,而不能引用上层的资源,当上层资源发生变动时,下层是不会受到影响的. ①资源层IFC体系架构中的最低层,能为其他层所引用.主要是描述标准中用到的基本信息,不针对具体的行业本身,是无整体结构的分散信

如何应对云爆发架构?四种方法替你解忧

[TechTarget中国原创] 虽然大多数CIO喜欢混合云方案,但现实却悄悄遇到了点烦人的小问题——如受美国和欧盟的一些电信业务光纤连接投资不足所累.欢迎来到云爆发架构的地狱式网络体验. 缺乏公有云与私有云之间的带宽使得云爆发与敏捷需要重新定位IT工作负载的理论概念.此外在云爆发架构中迁移数据与系统配置的成本与在局域网(LAN)带宽和存储访问相比,要大得多. 这个与网络资源有关的问题导致了NetApp和Verizon两家公司,成立了合资企业以合作将用户数据传输到Verizon数据中心,以加快公

高负载web架构(四)

f.在node9上部署好zabbix 监控: 最关键的工具:传感器:收集数据,检测数据 过程: 数据采集 --> 数据存储 --> 数据展示 报警:采集到的数据超出阈值 常见的实现监控SNMP:Simple Network Management Protocol 简单网络管理协议 有两部分组成:监控端(NMS)和被监控端(agent) SNMP的工作模式: NMS主动向agent采集数据 agent主动向NMS报告数据 NMS请求agent修改配置 SNMP的组件:三部分组成 MIB:mana