MyException - 我的异常网
当前位置:我的异常网» 研发管理 » 分布式协议之两阶段提交协议(2PC)跟改进三阶段提

分布式协议之两阶段提交协议(2PC)跟改进三阶段提交协议(3PC)

www.MyException.Cn  网友分享于:2015-07-01  浏览:0次
分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)

一、 事务的ACID

事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。


A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操

作成功,而另外一部分操作没有成功。如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态。比如银行的转账服务,

这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化。而不会出现其

情况。

 

C是Consistency,一致性。一致性是指事务发生前和发生以后,都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整

性。这种约束关系可以是数据库内部的约束,比如数据库元素的值必须在一定的范围内,也可以是应用带来的约束,比如转账以后银行账户

的余额不能为负数。
 
I是Isolation,隔离性。一个事务的操作在未提交以前,是不会被并行发生的其他事务访问到的。也就是说,数据库操作不会看到某个事务
的中间操作结果,比如转账过程中,用户是不能查询到一个账户余额减少了,而另外一个账户余额未发生变化的情况。
 
D是Durability,持久性。事务完成以后,它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其他故障的情况下,这种影响也

会得到保持。


二、 数据库事务性具有ACID4个特性,那么在分布式系统中是怎么保证这4个特性的呢?我们先来看看原子性的实现二阶段提交协议(2PC).

1 二阶段提交(2PC)

  分布式系统的一个难点是如何保证架构下多个节点在进行事务性操作的时候保持一致性。为实现这个目的,二阶段提交算法的成立基于以下假设:

1)该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts)。且节点之间可以进行网络通信。
2)所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
3)所有节点不会永久性损坏,即使损坏后仍然可以恢复。


  第一阶段(投票阶段):

1)协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节点的响应。

2)参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。(注意:若成功这里其实每个参与者已经执行了事务操作

3)各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。

  第二阶段(提交执行阶段):

  当协调者节点从所有参与者节点获得的相应消息都为"同意"时:

1)协调者节点向所有参与者节点发出"正式提交(commit)"的请求。

2)参与者节点正式完成操作,并释放在整个事务期间内占用的资源。

3)参与者节点向协调者节点发送"完成"消息。

4)协调者节点受到所有参与者节点反馈的"完成"消息后,完成事务。


  如果任一参与者节点在第一阶段返回的响应消息为"中止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:

1)协调者节点向所有参与者节点发出"回滚操作(rollback)"的请求。

2)参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。

3)参与者节点向协调者节点发送"回滚完成"消息。

4)协调者节点受到所有参与者节点反馈的"回滚完成"消息后,取消事务。

  不管最后结果如何,第二阶段都会结束当前事务。


  二阶段提交看起来确实能够提供原子性的操作,但是不幸的事,二阶段提交还是有几个缺点的:

  1、执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。

  2、参与者发生故障。协调者需要给每个参与者额外指定超时机制,超时后整个事务失败。(没有多少容错机制)

  3、协调者发生故障。参与者会一直阻塞下去。需要额外的备机进行容错。

  4、二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产

生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。


2 三阶段提交协议(3PC)


  与两阶段提交不同的是,三阶段提交有两个改动点。

  1、引入超时机制。同时在协调者和参与者中都引入超时机制。

  2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

具体流程见下图:



两阶段提交与三阶段提交的区别:

没有任何事情是完美的。特别是在分布式的情况下。事实上,分布式在某个程度上其实是人类社会发展的一个极佳写真。因为人类社会中个体的可靠性显然比分布式系统节点的可靠性要低很多。
三阶段提交也不完美。但是它比两阶段好。
两阶段的问题可以这样分解:

1,协调者出错,参与者也出错;

2,协调者出错,参与者不出错;

3,协调者不出错,参与者出错;

4,协调者不出错,参与者也不出错。

显然第4种不是问题。所以实际上只有3个问题。而问题2可以通过简单地NEW一个新的协调者来解决。问题3的错则显然正是两阶段提交协议的解决目标,所以也没有问题。有问题的只有协调者出错,参与者也出错的问题1。

这种情况可以被进一步分为参与者有没有收到提交的消息。如果参与者没有收到提交的消息,那么显然将不会(或没有---从系统恢复的角度)发生任何真正的提交行为;而如果有任何参与者收到了提交的消息,那么就很可能发生或已经发生了真正的提交行为。这个“可能”,为系统引入了不确定因素。系统没有办法解决这样的问题,唯一的办法便是引入超时机制。否则除了事务没有办法终结以外,部分参与者节点还有可能永不释放其所持有的全部数据锁。

超时机制的引入意味着将两阶段的第二阶段再度分开成两个阶段:不确定阶段与确定阶段。超时以前是不确定操作阶段,超时以后是确定操作阶段。因为在超时发生以前,系统处于不确定阶段,但是超时发生以后,系统则转入确定阶段。超时事件本身,则是系统进行状态转换的信号。但是因为真正引起超时的错只会在协调者与参与者同时出错(对于不出错但超时的情况,视为出错。即超时本身就是一种错---如果超时不“是”错,那么超时机制在这里就不可能工作---这其实就是超时机制的逻辑根本所在。超时是一种错,所以超时可以被用来表示错。如果用一种不是错的信号来表示错,那要区分真正的错就会很困难了)的情况下才会发生,在其它所有的情况下并不会发生,所以必须对这些情况进行相同的状态划分:准备好与提交状态。这些名词并不是很合乎它要表示的语义,但两个状态足够表达所有的情况才是最重要的事情。至于语义,则可以在人的大脑中得到正确的转化。

参考文档:https://en.wikipedia.org/wiki/Three-phase_commit_protocol_ei.cs.vt.edu/~cs5204/fall99/distributedDBMS/sreenu/3pc.html

                  http://my.oschina.net/digerl/blog/34139

                  http://blog.csdn.net/shenlan211314/article/details/7283948

版权声明:本文为博主原创文章,未经博主允许不得转载。

文章评论

程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
代码女神横空出世
代码女神横空出世
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
总结2014中国互联网十大段子
总结2014中国互联网十大段子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
每天工作4小时的程序员
每天工作4小时的程序员
程序员的鄙视链
程序员的鄙视链
程序员必看的十大电影
程序员必看的十大电影
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
中美印日四国程序员比较
中美印日四国程序员比较
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
程序员应该关注的一些事儿
程序员应该关注的一些事儿
我的丈夫是个程序员
我的丈夫是个程序员
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员都该阅读的书
程序员都该阅读的书
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
 程序员的样子
程序员的样子
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
漫画:程序员的工作
漫画:程序员的工作
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
编程语言是女人
编程语言是女人
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
鲜为人知的编程真相
鲜为人知的编程真相
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
老程序员的下场
老程序员的下场
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有