在分布式系统中通常存在着多个机器节点,每个节点只能控制自己事务的成功与失败而无法获知其他节点的事务执行结果,这时当事务操作跨越多个节点时就会存在无法满足分布式系统ACID中的数据一致性(Consistency)问题,这时就需要一个协调节点了统一调到分布式系统中其他节点的事务操作。
在分布式系统中通常存在两个问题,可用性、数据一致性,通常我们会在可用性与数据一致性之间做一个衡量,在这需求中就产生了一致性协议;在解决分布式一致性问题中产生了不少经典的分布式一致性算法;MongoDB的分支TokuMX也开发了他自己的一致性算法ARK,这里主要介绍三个比较著名的一致性协议算法:两阶段提交协议、 三阶段提交协议,后面有时间也会详细的介绍Paxos算法与ZAB协议;
2PC(Two Phase Commit)协议
二阶段提交协议(2PC)通常用来保证数据的强一致性,二阶段提交协议(2PC)中存在两种类型的节点:协调节点和数据节点(或称协调者与参与者),数据节点可以说是数据在多个节点的备份,协调节点用户协调管理多个数据节点在事务操作中数据的一致性问题;
2PC(Two Phase Commit)协议通常分为两个阶段进行,提交请求阶段(Commit Request Phase)或称投票阶段(Voting phase)、与提交阶段(Commit Phase);
1.提交请求阶段(Commit Request Phase),协调者发送请求给参与者,通知参与者提交或取消事务,参与者进入投票过程,每个参与者回复给协调者自己的投票:同意(事务在本地执行成功)或取消(事务本地执行失败)。
2.提交阶段(Commit Phase),协调者对上一阶段参与者的投票结果进行表决,当所有投票为“同意”时提交提交事务,否者中止事务,并通知参与者,参与者接到通知后执行相应的操作。
2PC(TWO Phase Commit)假定节点没有崩溃、任意两个节点的网络都是正常连通的、在写日志的过程中数据不会丢失的前提下。
协议过程描述图
事务成功提交流程
事务失败回滚流程
3PC(Three-Pase Commit)协议
3PC,三阶段提交协议为2PC的升级版,在二阶段提交协议基础上又加了一个阶段,三阶段为:CanCommit、PreCommit、doCommit组成的事务处理协议;
协议过程描述图
三阶段提交协议流程