ZooKeeper之两阶段提交(2PC)
两阶段提交
2PC:在分布式系统中,每一个机器节点虽然能够明确的知道自己在进行事物操作过程的结果是失败或成功,但却无法直接获取其他分布式节点的操作结果,因此事物操作需要跨越多个分布式节点的时候,需要引入一个协调者统一调度所有节点的执行逻辑。
阶段一:提交事物请求
- 事物询问
协调者向所有的参与者发送事物内容,询问是否可以执行事物操作,并开始等待各参与者的响应。
- 执行事物
各参与者节点执行事物操作,并将Undo和Redo信息记入事物日志中
- 各参与者向协调者反馈事物询问的响应
如果参与者成功执行了事物操作,那么就反馈给协调者Yes响应,表示事物可以执行;如果参与者没有成功执行事物,那么就反馈给协调者No响应,表示事物不可以执行。
阶段二:执行事物请求
在阶段二中协调者会根据参与者的反馈情况来决定最终是否可以进行事物操作,其中有两种可能。
执行事物提交
假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事物响应。
- 发送提交请求。
协调者向所有参与者节点发出Commit请求
- 事物提交
参与者接收到Commit请求后,会正式执行事物提交操作,并在完成提交之后释放在整个事物执行期间占有的事物资源。
- 反馈事物提交结果
参与者在完成事物提交之后,向协调者发送Ack消息。
- 完成事物
协调者接收到所有参与者反馈的Ack消息后,完成事物。
优缺点
- 优点:原理简单,实现方便
- 缺点:同步阻塞,单点问题,脑裂,太过保守。