【摘要】:下面讨论一个典型的提交协议,即两阶段提交协议。这种模式用到分布式事务管理就是两阶段提交协议。参与方接收到prepare消息后,就会检查自己能否提交。图10.132PC协议时协调者和参与者的状态转换图由图10.13可知:第一,2PC协议允许参与者单边夭折一个事务,直到它决定加入肯定选择前,它都是自由的。图10.14集中式2PC协议的通信结构实现时,2PC协议可以使用许多种不同的通信方式。图10.15线形2PC协议的通信结构协调者发送″prepare″消息给参与者2。
下面讨论一个典型的提交协议,即两阶段提交(two-phase commit,2PC)协议。
按照Wikipedia(http://en.wikipedia.org/wiki/Two-phase_commit_protocol)的说法:
Incomputer networking and databases,the two-phase commit protocol(2PC)is a distributed algorithm that lets all nodes in a distributed system agree to commit a transaction.The protocol results in either all nodes committing the transaction or aborting,even in the case of network failures or node failures.However,the protocol will not handle more than one random site failure at a time.The two phases of the algorithm are the commit-request phase,in which the coordinator attempts to prepare all the cohorts,and the commit phase,in which the coordinator completes the transactions.
为了直观分析2PC协议,我们可以借用现实中的例子,即西方影视中在教堂里请神父主持婚礼的场景,在这种场景里,神父起着协调的作用,神父对婚姻的确认是分两个阶段实施的。首先,准备结婚的新人就绪后来到教堂,请神父确认婚姻。神父并非立即宣称婚姻成立,而是先询问女方是否愿意嫁给男方,询问男方是否愿意娶女方为妻。如果其中任何一方对婚姻有异议,神父就宣布婚姻无效,否则就宣布婚姻成立。在神父询问阶段,男女当事人都有自主权,可以自由地按其意愿表态是否结婚。一旦他们表态后,进入第二个阶段,这个自主权就无效了,主动权落到神户手里。由神父来决定和宣布婚姻是否成立。这种模式用到分布式事务管理就是两阶段提交协议。
2PC协议很简单,也很有用,这样一个协议可以保证分布式事务的原子提交。2PC协议扩展了本地原子提交动作到分布式事务,其途径是让所有涉及执行的分布式事务遵循一条规则:在使分布式事务永久化前先提交事务。
在分布式事务中,有一个很重要的原则是“单边夭折”,即参与者发现无法(或不打算)把事务执行(或提交)下去就可以自主决定夭折,从而使得整个事务夭折。
2PC协议可以简述如下:协调者把″begin-commit″记录写入日志,把prepare消息发送给所有参与节点,然后进入WAIT状态。参与方接收到prepare消息后,就会检查自己能否提交。若能,则将″ready″记录写入日志,发送vote-commit消息给协调者,进入READY状态;否则,参与方把″abort″记录写入日志,发送vote-abort消息给协调者。如果节点的决策是abort,则它可以忘记这个事务,因为无论这个事务的最后结局是否选择夭折(单边夭折)。协调者收到所有参与者的答复后,决定是提交该事务还是夭折该事务。只要有一个参与方否决,协调者就决定全局夭折事务。这样,协调者在日志中写入″abort″记录,发送global-abort消息给所有参与方,然后进入ABORT状态。否则,协调者写入″commit″记录,发送global-commit消息给所有参与方,然后进入COMMIT状态。参与方按照协调者的指令提交或夭折,然后把答复发送回去。此时,协调者把″end-of-transaction″记录写入日志,结束事务。
算法如下。
●只要有一个参与者选择了abort事务,协调者必须决定全局abort。
●只有所有参与者选择commit,协调者才能决定全局commit。
2PC协议下,协调者和参与者的状态转换如图10.13所示。
图10.13 2PC协议时协调者和参与者的状态转换图
由图10.13可知:第一,2PC协议允许参与者单边夭折一个事务,直到它决定加入肯定选择前,它都是自由的。第二,一旦参与者选择提交或夭折一个事务,它就无法再改变自己的决定。第三,在参与者进入READY状态时,取决来自协调者的消息,协调者可以夭折事务,也可以提交事务。第四,协调者按照全局终止规则做出全局终止决策。第五,协调者和参与者进程进入一定状态必须互相等待对方的消息。为了保证能够从进入的状态退出,使用了计时器。每个进程进入一个状态就设置计时器,确定的计时超过就属于超时,就按照超时处理协议。
(www.chuimin.cn)
图10.14 集中式2PC协议的通信结构
实现时,2PC协议可以使用许多种不同的通信方式。前面所述的是一种集中式2PC协议,因为通信只发生在协调者和参与者之间,参与者之间互不通信,如图10.14所示。
线形(或嵌套)2PC协议的通信结构图10.15所示。为了通信,系统节点之间应有一个序。假设参与者执行事务时的节点间有一个序1,…,N,协调者排在这个序的第一位。2PC协议按照从1到N序进行通信。第一阶段完成后,倒过来从N开始与协调者通信,完成第二阶段。其工作过程可以演示如下。
图10.15 线形2PC协议的通信结构
协调者发送″prepare″消息给参与者2。如果参与者2不准备提交该事务,则它发送″voteabort″(VA)消息给参与者3,事务在这一点夭折。反之,参与者2同意提交该事务,它发送″vote-commit″(VC)消息给参与者3,进入READY状态。这个过程持续下去,直到″vote-commit″消息到达参与者N。第一阶段结束。在参与者N决定提交时,它发送回″global-commit″(GC)消息给N-1;否则发送″global-abort″(GA)消息。接着,参与者逐个进入相应状态(COMMIT或ABORT),把消息传送回协调者。
还有一种可以实现2PC协议的通用的通信结构,在第一阶段就涉及所有参与者的通信,这个方案称为分布式2PC(distributed 2PC)。由于参与者一次就获得了消息,所以省去了第二阶段。其工作如下:协调者向所有参与者发送″prepare″消息,然后每个参与者将其决策发送给所有其他参与者和协调者,并发送一条″vote-commit″或″vote-abort″消息。每个参与者等待所有其他参与者的消息,按照全局提交规则做出终止决策。显然,无须等待协议的第二阶段,在第一阶段结束时每个参与者已经独立达到了它的决策。分布式2PC协议的通信结构如图10.16所示。
下面是采用集中式通信结构的2PC协议的算法例子。这里,我们分别讨论协调者和参与者的反应。
算法10.1 2PC(协调者)。
图10.16 分布式2PC协议的通信结构
相关推荐