分类: 云计算
2012-07-15 21:30:37
2PC协议在多数据中心,多路写的情况下,保证数据一致性而设计的协议。
2PC思想比较简单,是一个失败,全体不成功;如果成功,就没有一个失败的简单逻辑,实现简单。
本文讲述其大概流程,client提交数据到N个节点上,其中一个节点选为协调员coordinator,其他作为cohorts(partcipant)。2PC做了一些假设:
1、 每个节点都有稳定存储(stable storage), 并且都会每次写操作都有预写日志(write-ahead log);
2、 预写日志永远不会丢失和破坏;
3、 任何节点之间都能互相通信;
4、每个参与者都是blocking的,有资源锁存在。
实现表述画一个时序流程图来介绍吧,一目了然。
一个更详细的状态机实现
上图中每个节点,每一步都有log记录,以准备rollback,其中任何一步都有失败的可能,收不到对方的消息。
在 phase 1阶段,任何错误包括超时错误,都不会产生任何问题。
在 phase 2阶段,如果是coordinator发出global commit后,有个或几个cohorts失效。就发生了数据不一致的错误,存在一些cohorts更新数据,一些cohorts没有更新数据。但是,coordinator没有机会向所有cohorts发出global abort撤销提交。
在实际生产环境中,2PC很少被使用。一般使用其改进版:如D2PC()