分布式系统设计中,几乎都需要在服务可用性性 和数据一致性之间做权衡,也因此诞生了一系列的一致性协议,常见的有2PC一致性协议、3PC一致性协议、Paxos一致性算法、Raft一致性算法。
一、2PC一致性协议
2PC,也叫做二阶段提交协议,是指将在分布式环境下多个分布节点的事务提交过程分成两个阶段来进行处理:
第一个阶段是事务执行,即多个节点先提交,但是不commit事务;
第二个阶段是事务提交,即协调者统计多个节点第一个阶段是否都执行成功,都执行成功再让多个节点commit事务。
(1)阶段一:执行事务
- 协调者节点向多个参与者节点发送事务内容,
- 参与者节点收到命令后就开始执行事务操作,同时将Undo(保证一致性)和Redo(保证事务原子性和持久性)信息记入事务日志中;
- 如果每个节点事务都执行成功,则回复"YES"响应给协调者;否则返回"No"响应。
(2)阶段二:执行事务提交
- 如果协调者节点发现所有参与者节点都返回了"YES"响应,则向所有参与者节点发送"Commit"指令;
- 参与者节点收到"Commit"指令之后,执行事务的提交;事务提交之后向协调者节点发送"ACK"响应;
- 协调者接收到所有"ACK"响应之后,完成整个事务操作。
以电商购买商品为例,减库存和扣减账户金额需要保证事务一致性。正常情况下阶段一、阶段二操作如下:
(3)事务中断
如果在阶段一或阶段二任一节点协调者与参与者失去联系,都要进行事务中断操作。
若在第2个阶段中,协调者发现有节点返回"NO"或者没有接收到所有参与者节点返回的"YES"响应,就会发起事务中断操作。
- 协调者向参与者节点发起"Rollback"请求,进行事务回滚;
- 参与者节点收到Rollback请求后,会利用Undo日志中记录的日志信息进行事务回滚;完成之后返回"ACK";
- 协调者收到所有参与节点的"ACK"响应之后,完成事务中断。
2PC优缺点:
优点:原理简单
缺点:
- 同步阻塞问题:第一、二阶段中,由于协调者等待参与者节点是同步阻塞,即协调者在收到所有参与者的响应之前是不会处理任何请求的,性能差;
- 协调者单点问题:如第一阶段中,如果协调者在向第1节点发送执行事务命令后,还未来得及向第3个参与者节点发送事务执行命令后发生宕机,那么第二个阶段就无法完成,并可能导致参与者节点一直处于锁定事务资源状态中;
- 多个节点数据不一致问题:第二阶段如果协调者发送的’Commit’指令无法保证所有节点都能收到,这样就会出现部分节点Commit事务操作,部分节点未执行导致节点间数据不一致
- 保守&#