每天聊点区块链9:三段式提交

前言

在两段式提交中,当协调节点与另外一个节点同时出现故障时,怎么样才能保证系统状态的一致性呢?这个时候就用到了三段式提交。

一 简介

三段式提交在正式提交前,协调者再发一次“准备提交”的消息,在收到所有的节点回复之后,协调者才发送“提交”命令。

二 三段式提交解决了什么问题

在两段式提交中,如果一个参于者节点收到了协调者节点发送了准备好的回复,如果这条指令发生成功了,却一直没有收到协调者的下一条指令,而这是一个强连通的网络拓扑结构,这个节点已经知道了协调者出现故障了,此时它也不能单方面的回滚释放资源,因为这个节点不能确定协调者在故障之前是否已经做了Commit的决定,是否有参与者实施了该决定。那么在这种请况下该节点可以做什么选择呢?第一它可以继续等待直到恢复与协调者的通信。第二 与其他参与终止协议,重新选举新的协调者。这两个方案都有问题,第一种没人知道协调者什么时候可以恢复通信。第二种假设有的参与者已经执行了协调者的Commit指令并且已经执行成功了,所有节点就不一致了。
为了解决这个问题三段式提交被提了出来,三段式提交可以部分的解决这个问题,当协调者收到了所有参与者同意的指令之后,协调者会再次向参与者发送一条指令,告诉它们所有节点已经协商同意提交了,可以开始准备提交了,那么每一个节点就可以知道其他节点协商通过了,但是这个时候参与者节点并没有做任何提交工作,它只是回复一切正常可以提交,如果全部参与者节点发送了准备好的回复,协调者节点才发“提交指令”。三段式提交相对与两段式提交减少了故障发生的概率,但也增加了网络开销,如果一个系统故障率要求没那么高,使用两段式就可以了。而且三段式也不是完全没有异常情况,如果在发送准备提交指令的时候发生故障,参与者节点与协调者节点无法通信,依然会出现前面的问题,区别只是概率会变得更小了。

三 总结

无论两阶段还是三阶段都无发解决共识问题,所以自然也不能成为一个分布式共识算法,只能够在一个同步式的分布式系统中达成一致性,而通常的分布式系统是由多个主机通过异步通信方式组成网络集群。

你可能感兴趣的:(每天聊点区块链9:三段式提交)