二段式提交和三段式提交

CAP定理

2000年7月加州大学伯克利分校 Eric Brewer教授提出CAP猜想,两年后被证明。

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C,Consistency),可用性(A,Availability)和分区容错性(P,Partition tolerance)三个基本要求,最多只能同时满足其中两个。

一致性:分布式系统中,能够做到针对一个数据的更新成功后,其他所有的用户都可以读取到[最新的值],那么这样子的系统就是强一致性的。

可用性:[有限时间内][返回结果]

分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够抱枕固堤外提供满足一致性和可用性的服务。

其实CAP定理是理论,现实系统场景中的CAP也不一定会真的会放弃其中一个不做,而是我们可以着重性的保证其他两个,而剩下的一个尽量保证。

在一些面试中,面试官是比较喜欢提问到如果保证分布式事务的。比较出名的解决办法就是二段式提交协议、三段式提交协议和Paxos算法了。

二段式提交协议]是将事务的提交过程分成了两个阶段来进行处理,其执行过程如下:

阶段一:提交事务请求:

1、事务询问。协调者向所有参与者发送事务内容,询问是否可以进行事务提交操作,然后就开始等待参与者的响应。

2、执行事务。各参与者节点执行事务奥做,并将Undo和Redo信息记入事务日志中。

3、各参与者向协调者反馈事务询问的响应。

阶段二:执行事务提交:

假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务提交。

1、发送提交请求。

2、事务提交。

3、反馈事务提交结果。参与者在完成事务提交之后,会向协调者发送Ack消息。

4、完成事务。

中断事务:

1、发送回滚请求。协调者向参与者发出rollback请求。

2、事务回滚。参与者接收到Roolback请求利用阶段一种记录的Undo信息来执行事务回滚动作。

3、反馈事务回滚结果。

4、中断事务。

二段式提交协议的优缺点:

优点:原理简单,实现方便;

缺点:同步阻塞、单点问题、脑裂(比如协调者的消息在网络异常情况下只给一部分参与者发送了)、太过保守。

[三段式提交协议]其实是在二段式基础上面针对二段式的缺点进行了改进。

阶段一:CanCommit

1、事务询问。

2、各参与者向协调这反馈事务询问的响应。

阶段二:PreCommit

假设协调者从所有的参与者获得的都是Yes响应,那么将执行事务预提交。

1、发送预提交请求。协调者向所有参与者节点发出preCommit请求,进入prepared阶段。

2、事务预提交。参与者接收到preCommt请求,执行事务擦偶走,将Undo和Redo信息记录到事务日志中。

3、各参与者向协调者反馈事务提交的响应。

假设任何一个参与者向协调者反馈了No反应,活着在等待超时之后,协调者无法获得所有参与者的响应,那么将执行事务的中断。

1、发送终端请求。协调者向所有参与者发出abort请求。

2、中断事务。无论接到abort请求还是等待协调者请求过程出现超时情况,参与者都会中断事务。

阶段三:doCommit

该阶段将进行真正的事务提交:

执行提交

1、发送提交请求。进入这一阶段,假设协调者从正常的工作状态,并且接收到所有的参与者的ack响应,它将从预提交状态转换到提交状态,向所有参与者发送doCommit请求。

2、事务提交。参与者接收到doCommit请求后,正式执行事务提交操作。并在提交后释放在整个事务执行期间占用的事务资源。

3、反馈事务提交结果。参与者完成事务提交之后,向协调者发送Ack消息。

4、完成事务。协调者接收到所有参与者的Ack消息,完成事务。

中断事务

中断事务的4步操作与提交事务完全一致,只不过从提交事务变成了事务回滚。

三段式提交协议的优缺点:

最大优点就是降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。

缺点就是在去除阻塞的情况下引入了新的问题,那就是参与者接收到了PreCommit消息,然后网络出现问题,参与者和协调者无法通信,这种情况下,参与者依然会执行事务的提交。

----

该文内容出自倪超的《从Paxos到zookeeper》

时间: 2024-08-01 01:21:26

二段式提交和三段式提交的相关文章

<从PAXOS到ZOOKEEPER分布式一致性原理与实践>读书笔记-两阶段提交与三阶段提交

一.背景 本书第一章的分布式架构,写了从单机的acid到分布式的CAP.参见之前的文章.本篇是第二章的一致性协议部分,分两篇整理. 在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上.为了对用户提供正确的增\删\改\查等语义,我们需要保证这些放置在不同物理机器上的副本是一致的. 为了解决这种分布式一致性问题,有很多经典算法:如二阶段提交.三阶段提交,paxos算法. 二.二阶段提交(2PC) 二阶段提交(Two-phaseC

二阶段提交和三阶段提交

一.2PC 2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase).提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段 整个事务过程由事务管理器和参与者组成,事务管理器负责 决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚 在计算机中部分关系数据库如Oracle.MySQL支持两阶段提交协议,如下图: 准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者

对分布式事务及两阶段提交、三阶段提交的理解

转载至:http://www.cnblogs.com/binyue/p/3678390.html,最近学习需要,先转载方便用用来强化加深印象 一.分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上. (1)什么是数据一致性 在数据有多份副本的情况下,如果网络.服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败.这就造成各个副本之间的数据不一致,数据内容冲突. 造成事实上的数据不一致. (2)CAP定

分布式事务 - 两阶段提交与三阶段提交

在分布式系统中,著有CAP理论,该理论由加州大学伯克利分校的Eric Brewer教授提出,该理论阐述了在一个分布式系统中不可能同时满足一致性(Consistency).可用性(Availability),以及分区 容错性(Partition tolerance). 一致性在分布式系统中数据往往存在多个副本,一致性描述的是这些副本中的数据在内容和组织上的一致. 可用性可用性描述了系统对用户的服务能力,所谓可用是指在用户容忍的时间范围内返回用户期望的结果. 分区容错性分布式系统通常由多个节点构成,

两阶段提交与三阶段提交【分布式数据一致性】

1.任何一个技术,都是为了解决某个问题,有它的使用场景. 2.考虑下面的应用场景:一个指挥官,A,B,C,D四个将军分布在四个方向,指挥官制定明天攻城的计划.如何保证四个将军同时执行攻城的命令? 第一个阶段:指挥官分别发给将军消息,计划明天攻城,四个将军分别回复是否准备好. 第二个阶段: 指挥官确认四个将军是否都准备好,如果都准备好,下发命令,明天攻城.如果存在没有准备好的,下发命令,放弃攻城,四个将军分别再回复一下说,知道了. 这就是两阶段提交,为了解决分布式数据的一致性. 3.考虑下面的情况

FPGA三段式状态机的思维陷阱

用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点: 1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护; 2.更符合设计的思维习惯; 3.代码少,比一段式状态机更简洁. 对于第一点,我非常认可,后两点在Clifford E. Cummings著的(Synthesizable Finite State Machine Design Techniques Using theNew SystemVerilog 3.0 Enhancements和The Fundame

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的分析,探索OkHttp这个框架的使用和封装 一.追其原理 Android系统提供了两种HTTP通信类 HttpURLConnection HttpClient Google推荐使用HttpURLConnection,这个没必要多说,事实上,我这篇写的应该算是比较晚了,很多优秀的博文都已经提出了这些观

jquery.validate+jquery.form提交的三种方式

原文:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html jquery.validate+jquery.form提交的三种方式 概述:本篇主要讨论jquery.validate结合jquery.form实现对表单的验证和提交方案. 方式一:是通过jquery.validate的submitHandler选项,即当表单通过验证时运行回调函数.在这个回调函数中通过jquery.form来提交表单: 方式二:是通过jquer

Verilog三段式状态机描述

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件. 三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说