标签:
前面我们说过数据库事务性具有ACID4个特性,那么在分布式系统中是怎么保证这4个特性的呢?我们先来看看原子性的实现二阶段提交协议(2PC).
一、二阶段提交(2PC)
分布式系统的一个难点是如何保证架构下多个节点在进行事务性操作的时候保持一致性。为实现这个目的,二阶段提交算法的成立基于以下假设:
第一阶段(投票阶段):
第二阶段(提交执行阶段):
当协调者节点从所有参与者节点获得的相应消息都为"同意"时:
如果任一参与者节点在第一阶段返回的响应消息为"中止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
不管最后结果如何,第二阶段都会结束当前事务。
二阶段提交看起来确实能够提供原子性的操作,但是不幸的事,二阶段提交还是有几个缺点的:
1、执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
2、参与者发生故障。协调者需要给每个参与者额外指定超时机制,超时后整个事务失败。(没有多少容错机制)
3、协调者发生故障。参与者会一直阻塞下去。需要额外的备机进行容错。(这个可以依赖后面要讲的Paxos协议实现HA)
4、二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。
为此,Dale Skeen和Michael Stonebraker在“A Formal Model of Crash Recovery in a Distributed System”中提出了三阶段提交协议(3PC)。
二、三阶段提交协议(3PC)
与两阶段提交不同的是,三阶段提交有两个改动点。
1、引入超时机制。同时在协调者和参与者中都引入超时机制。
2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
具体流程见下图:
具体读者可以参考维基百科和下面的文章,俺就不在赘述了。
https://en.wikipedia.org/wiki/Three-phase_commit_protocol
ei.cs.vt.edu/~cs5204/fall99/distributedDBMS/sreenu/3pc.html
三、画外音
2PC协议因为其阻塞的特性,在执行过程中需要锁住其他更新,且容错不够好,所以对其支持的成本较高。分布式系统用2PC协议更多的是处理多个数据分片操作的原子性。而同一个数据分片的多个副本之间的数据一致性则更多的使用Paxos来实现。
后面我们就来了解下这个被google在chubby中甚赞(Indeed, all working protocols for asynchronous consensus we have so far encountered have Paxos at their core.)的分布式一致性算法:Paxos!
分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)
标签:
原文地址:http://www.cnblogs.com/lhonglwl/p/4280598.html