一致性协议
事务需要跨多个分布式节点时。为了保证事务的ACID特性,需要选举出一个协调者来协调分布式各个节点的调度,基于这个思想衍生多种一致性协议:
2PC二阶段提交
-
顾名思义,二阶段叫事务的提交过程分为两个阶段:
阶段一提交事务请求
- 1.协调者向所有的参与者节点发送事务内容,询问是否可以执行事务操作,并等待其他参与者节点的反馈
- 2.各参与者节点执行事务操作
- 3.各参与者节点反馈协调者,事务是否可以执行
阶段二事务提交
- 根据一阶段各个参与者节点反馈的ack,如果所有参与者节点反馈ack,则执行事务提交,否则中断事务
- 事务提交:
- 1.协调者向各个参与者节点发送commit请求
- 2.参与者节点接受到commit请求后,执行事务的提交操作
- 3.各参与者节点完成事务提交后,向协调者返送提交commit成功确认消息
- 4.协调者接受各个参与者节点的ack后,完成事务commit
- 中断事务:
- 1.发送回滚请求
- 2.各个参与者节点回滚事务
- 3.反馈给协调者事务回滚结果
- 4.协调者接受参与者节点ack后回滚事务
二阶段存在的问题
- 同步阻塞
- 二阶段提交过程中,所有参与者操作的节点处于同步阻塞状态,无法进行其他的操作
- 单点问题
- 一旦协调者出现单点故障,无法保证事务的一致性操作
- 脑裂导致数据不一致
- 如果分布式节点出现网络分区,某些参与者未收到commit提交命令。则出现部分参与者完成数据提交。未收到commit的命令的参与者则无法进行事务提交,整个分布式系统便出现了数据不一致现象。