文章部分图片来自参考资料,侵删

概述

上一篇我们讲到CAP 理论,分区容错性,一致性,可用性三者不可能同时存在,而分区容错性又是客观存在的,那么为了保证可用性,我们牺牲了一致性,虽然我们保证不了强一致性,但是(Base理论)我们可以保证最终一致性。 而 2pc(两阶段提交) 和 3pc(三阶段提交)都是为了一致性协议,通过这些协议保证一致性。

2pc

2PC协议有两个阶段:Propose和Commit.在没有出错的情况下的2PC协议流程的画风是这样的:

  • Propose阶段:
    • coordinator : "你们准备执行什么什么"
    • voter1/voter2/voter3: "收到!(各个节点写入要执行的动作)"
  • Commit阶段
    • coordinator: "确定执行"
    • voter1/voter2/voter3: "好哒(执行的动作落地)

假如在 Propose 有节点没准备好,那协调者就对本次执行 abort

但是 2pc 存在以下问题 , 例如在准备 commit phase 阶段, coordinator 和 voter3 刚好都 crash 了,那么vote1 和 vote2 就尴尬了,为什么呢? 因为现在存在以下的情况 :

(1)上轮全票通过然后voter3第一个收到了commit的消息并在commit操作之后crash了

(2)上轮voter3反对所以干脆没有通过.

那么 vote1 和 vote2 就会处在不知是否是 commit 还是 abort 的困境。同时 2pc 还存在以下的优缺点 :

缺点 :

  • 同步阻塞,第二阶段执行任务阶段,各节点都需要阻塞执行完成后,协调者才放开锁定的资源
  • 单点问题,协调者要是第二阶段 crash ,部分收到 commit 部分没有收到的话,就会造成数据不一致。

优点 :

  • 简单容易实现

2pc 在 CAP 中 属于 CA ,那么没办法解决 分区容错性的问题,但是它在性能和分区容错方面找到了平衡,使得关系数据库都喜欢使用 2pc 来实现分布式事务。

3pc

简单的说来, 3PC就是把2PC的Commit阶段拆成了PreCommit和Commit两个阶段. 通过进入增加的这一个PreCommit阶段, voter可以得到Propose阶段的投票结果, 但不会commit; 而通过进入Commit阶段, voter可以盘出其他每个voter也都打算commit了, 从而可以放心的commit.

        换言之, 3PC在2PC的Commit阶段里增加了一个barrier(即相当于告诉其他所有voter, 我收到了Propose的结果啦). 在这个barrier之前coordinator掉线的话, 其他voter可以得出结论不是每个voter都收到Propose Phase的结果, 从而放弃或选出新的coordinator; 在这个barrier之后coordinator掉线的话, 每个voter会放心的commit, 因为他们知道其他voter也都做同样的计划.

以下为 3pc 的过程。

下面的是 wiki 上的图 :

但是 3pc 也存在一定的问题 。

  • 网络分区时无法恢复

网络划分(network partition)

网络划分指的是 节点互相不能通信。

假设在PreCommit阶段所有节点被一分为二, 收到preCommit消息的voter在一边, 而没有收到这个消息的在另外一边. 在这种情况下, 两边就可能会选出新的coordinator而做出不同的决定.

情景如下所示

fail-recover

fail-recover 就是失败后过一阵子再恢复过来。

当coordinator收到preCommit的确认前crash, 于是其他某一个voter接替了原coordinator的任务而开始组织所有voter commit. 而与此同时原coordinator重启后又回到了网络中, 开始继续之前的回合---发送abort给各位voter因为它并没有收到preCommit. 此时有可能会出现原coordinator和继任的coordinator给不同节点发送相矛盾的commit和abort指令, 从而出现个节点的状态分歧.

总结

可以看到无论是 2pc 还是 3pc

补充

replication 和  partition

我们运用分布式的时候时常会使用两种手段对数据进行处理。一种是 切分,一种是复制,这两种分别对应于 partition 和 replication . 两者的操作如下 :

先说复制吧,最常见的就是主从复制,优势很明显,可以很好地处理分区容错性,要是主挂了,从的马上就可以顶上。缺点数据的一致性,上面的二阶段提交和三阶段提交都是为了解决一致性的问题。而 partition 可以将多个任务分成一小块一小块,充分发挥并发计算,同时解决数据增长带来的冲击,因为每一块都分出去了,所以计算压力得到了平摊。但是也会存在例如分区之间跨区访问受限,数据增长速度不同等问题,还可能存在著名的 Byzantine_fault_tolerance (拜占庭问题)。

拜占庭问题

拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利。来源 ;百度百科

简单地来说就是协调者发出某个请求,要求各个节点达成共识,共同对外 ,但是内部出现奸细,出现返回来的信息使得大家达不到一致性。

Partition tolerant consensus algorithms

最著名的 partition tolerant consensus 算法就是 Paxos 了,还有 Raft .

network partition

以下的描述很好地解释了 network partition

A network partition is the failure of a network link to one or several nodes. The nodes themselves continue to stay active, and they may even be able to receive requests from clients on their side of the network partition. As we learned earlier

consistency(一致性分类)

Consistency models can be categorized into two types: strong and weak consistency models:

  • Strong consistency models (capable of maintaining a single copy)

    • Linearizable consistency

    • Sequential consistency
  • Weak consistency models (not strong)
    • Client-centric consistency models

    • Causal consistency: strongest model available
    • Eventual consistency models (最终一致性)

其中强一致性包括 Linearizable consistency  和 Sequential consistency ,它们两者的差别在于 :

  • Linearizable consistency: Under linearizable consistency, all operations appear to have executed atomically in an order that is consistent with the global real-time ordering of operations. (Herlihy & Wing, 1991)

  • Sequential consistency: Under sequential consistency, all operations appear to have executed atomically in some order that is consistent with the order seen at individual nodes and that is equal at all nodes. (Lamport, 1979)

参考资料

分布式事务 --- 2PC 和 3PC的更多相关文章

  1. .Net Core with 微服务 - 分布式事务 - 2PC、3PC

    最近比较忙,好久没更新了.这次我们来聊一聊分布式事务. 在微服务体系下,我们的应用被分割成多个服务,每个服务都配置一个数据库.如果我们的服务划分的不够完美,那么为了完成业务会出现非常多的跨库事务.即使 ...

  2. 分布式事物-2pc和3pc区别

    参考地址: https://www.cnblogs.com/bangerlee/p/5268485.html, 感谢原作者 http://blog.51cto.com/11821908/2058651 ...

  3. 分布式事务(3)---RocketMQ实现分布式事务原理

    分布式事务(3)-RocketMQ实现分布式事务原理 之前讲过有关分布式事务2PC.3PC.TCC的理论知识,博客地址: 1.分布式事务(1)---2PC和3PC原理 2.分布式事务(2)---TCC ...

  4. .Net Core with 微服务 - 分布式事务 - TCC

    上一次我们讲解了分布式事务的 2PC.3PC .那么这次我们来理一下 TCC 事务.本次还是讲解 TCC 的原理跟 .NET 其实没有关系. TCC Try 准备阶段,尝试执行业务 Confirm 完 ...

  5. .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性

    前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...

  6. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...

  7. 三:分布式事务一致性协议2pc和3pc

    一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一 ...

  8. 分布式事务之深入理解什么是2PC、3PC及TCC协议?

    导读 在上一篇文章<[分布式事务]基于RocketMQ搭建生产级消息集群?>中给大家介绍了基于RocketMQ如何搭建生产级消息集群.因为本系列文章最终的目的是介绍基于RocketMQ的事 ...

  9. 分布式事务(1)---2PC和3PC理论

    分布式事务(1)---2PC和3PC理论 分布式事物基本理论:基本遵循CPA理论,采用柔性事物特征,软状态或者最终一致性特点保证分布式事物一致性问题. 分布式事物常见解决方案: 2PC两段提交协议 3 ...

随机推荐

  1. python 百万级别类实例实现节省内存

    # 案例: ''' 某网络游戏中,定义了玩家类Player(id,name,status) 每当有一个玩家,就会在服务器创建一个Player实例 当在线人数过多时,将产生大量实例(百万级别),消耗内存 ...

  2. C# LINQ GroupBy

    一.先准备要使用的类: 1.Person类: class Person { public string Name { set; get; } public int Age { set; get; } ...

  3. 简单实现一个Unity3d的Timer

    数量使用的不太多,没有实现对象池. using System.Collections; using System.Collections.Generic; using UnityEngine; usi ...

  4. 滑动窗口-洛谷T1866(单调队列)

    咕咕咕 单调队列板子题 一.基本 1.单调队列: 特殊的双端队列,内部元素.分为最大队列(单调递增)和最小队列(单调递减)两种 二.应用 本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最 ...

  5. linux-zookeeper安装、配置

    1.下载zookeeper包 (地址:https://www-eu.apache.org/dist/zookeeper/) 2.上传zookeeper包到指定位置(例如: /usr/local/sof ...

  6. 【音乐欣赏】《Abnormalize》 - 凛として時雨

    曲名:Abnormalize 作者:凛として時雨 [00:00.96]誰にも見せられないもの [00:06.44]頭の中溢れて [00:11.96]間違いさえも無い世界へ [00:17.16]迷い込ん ...

  7. Django_Setings

    """ Django settings for untitled1 project. Generated by 'django-admin startproject' u ...

  8. 搭建FEBS权限系统

    在码云看到一个FEBS权限系统,但是没有找到搭建手册,自己记录一下. 1.下载项目:https://github.com/wuyouzhuguli/FEBS-Shiro2.创建数据库:执行sql文件夹 ...

  9. JSP读取数据库二进制图片并显示

    用JSP从数据库中读取二进制图片并显示在网页上 环境mysql+tomcat: 先在mysql下建立如下的表. 并存储了二进制图像(二进制格式存储图片可以参考我的另一篇博客:https://www.c ...

  10. jquery grid 获取选中的行的数据,以及获取所有行的方法

    https://blog.csdn.net/shenqingkeji/article/details/52861319