系列文章 -> 分布式理论
分布式理论之 CAP 定理(布鲁尔定理)
分布式理论之 BASE 理论
分布式理论之 2PC 协议 (2 阶段提交协议)
2PC 是什么
同前文,2PC 也是缩写, 即 Two-phase Commit, 即二阶段提交
目的
二阶段提交协议是常用的分布式事务解决方案,它可以保证在分布式事务中,要么所有参与进程都提交事务,要么都取消事务,即实现 ACID 的原子性(A)。在数据一致中,它的含义是:要么所有副本(备份数据)同时修改某个数值,要么都不更改,以此来保证数据的强一致性。
知识预备 – 预写式日志 (Write-Ahead logging(WAL))
在计算机科学中,预写式日志(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID 属性中的两个)的一系列技术
二阶段提交算法成立的基本假设
分布式系统中, 存在一个节点作为协调者, 其他节点作为参与者
所有节点都采用预写式日志, 且日志被写入后即被保持在可靠的存储设备上, 即使节点损坏也不会导致日志数据消失
所有节点不会永久性损坏, 即使损坏后仍然可以恢复, 且节点之间可以互相通信
基本假设存在的风险
所有节点可以互相通信, 这个一般不是什么大问题, 通常可以重新路由网络通信
所有节点不会永久损坏, 这个问题很大, 比如服务器炸了
二阶段提交具体操作
提交请求阶段 (投票阶段)
第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作
协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
参与者节点执行询问发起为止的所有事务操作,并将 Undo 信息和 Redo 信息写入日志 (预写式日志)。
各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个 ” 同意 ” 消息;如果参与者节点的事务操作实际执行失败,则它返回一个 ” 中止 ” 消息
提交执行阶段 (执行阶段)
第二阶段也被称作完成阶段,因为无论结果怎样,协调者都必须在此阶段结束当前事务。
成功
当协调者节点从所有参与者节点获得的相应消息都为 ” 同意 ” 时:
协调者节点向所有参与者节点发出 ” 正式提交 ” 的请求。
参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送 ” 完成 ” 消息。
协调者节点收到所有参与者节点反馈的 ” 完成 ” 消息后,完成事务。
失败
如果任一参与者节点在第一阶段返回的响应消息为 ” 终止 ”,或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
协调者节点向所有参与者节点发出 ” 回滚操作 ” 的请求。
参与者节点利用之前写入的 Undo 信息执行回滚,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送 ” 回滚完成 ” 消息。
协调者节点收到所有参与者节点反馈的 ” 回滚完成 ” 消息后,取消事务。
总结
在分布式系统中,每个节点虽然可以知道自己的操作是成功还是失败,却无法知道其他节点的操作状态,当一个事务需要跨越多个节点时,为了保持事务的 ACID 特性,需要引入一个作为协调者的组件来统一掌握所有节点(参与者)的操作结果并最终指示这些节点是否需要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作结果通知协调者,在由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。
参考
The Two-Phase Commit Protocol 二阶段提交分布式理论 (三) – 2PC 协议分布式系统的一致性协议之 2PC 和 3PC