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

概述

上一篇我们讲到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. Sql Server:创建用户并指定该用户只能看指定的视图,除此之外的都不让查看

    1,在sql server中选择好要操作的数据库 2,--当前数据库创建角色 exec sp_addrole 'seeview'      --创建了一个数据库角色,名称为:[seeview] 3,- ...

  2. javascript增强typeof 对复杂类型的判断

    js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object). typeof 由于js中的变量是松散类型的 ...

  3. python中乱码怎么由来与解决方法

    前言曾几何时 Python 中文乱码的问题困扰了我很多很多年,每次出现中文乱码都要去网上搜索答案,虽然解决了当时遇到的问题但下次出现乱码的时候又会懵逼,究其原因还是知其然不知其所以然.现在有的小伙伴为 ...

  4. c++11 lambda简录

    本文为转载,详情请观看原文连接 或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个.这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 J ...

  5. Python - python3.7新增的contextvars vs Thread local(threading.local)

    总结 和threading.local()类似.Python3.7新增. thread.local(): 不同线程,同一个变量保存不同的值. contextvars: 不同上下文,同一个变量保存不同的 ...

  6. break continue goto

    break:跳出本层循环:continue:结束本次循环,并不跳出循环:goto:转移到指定位置,无条件转移:

  7. eclipse非正常关闭,再打开后报错

    Previous operation has not finished; run 'cleanup' if it was interrupted 启动任务管理器,将javaw.exe进程杀死,然后重启 ...

  8. 题解【洛谷P2341】 [HAOI2006]受欢迎的牛

    题面 题解 \(Tarjan\)缩点后统计每个点的出度. 如果有多个点出度为\(0\),就直接输出\(0\),否则输出出度为\(0\)的强连通分量里的点数. 代码 #include <iostr ...

  9. Windows下PHP安装 Imagick 扩展

    1.下载拓展下载地址一: http://windows.php.net/downloads/pecl/releases/imagick/下载地址二: https://pecl.php.net/pack ...

  10. 【做题笔记】洛谷P1464 Function

    我先谔谔一波 /kk 我谔谔 看题第一眼:欸这不就是按题意递归嘛,,直接搞不就好了 3 min 后,重新看题 然后自己手玩了几个样例,噢,递归太多了,铁定会 T 啊...... 然后,作为一个从没写过 ...