一致性协议
从这周开始深入学习Zookeeper,主要是看PAXOS到ZOOKEEPER分布式一致性理论与实践以及Zookeeper3.5的源码,在整个学习过程中会整理一些学习笔记。
2PC
2PC即两阶段提交,是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。两阶段提交将事务处理过程分为投票阶段和执行阶段两个步骤,其核心是采用先尝试后提交的处理方式。两阶段提交协议将事务的提交过程分成两个阶段来进行处理,其执行流程如下:
阶段一:提交事务请求
- 事务询问。协调者向所有的事务参与者发送事务内容,询问是否可以执行事务的提交操作,并等待个参与者的响应。
- 执行事务。各参与者执行事务操作,并将Undo和Redo信息记入事务日志。
- 各参与者向协调者反馈事务响应。如果参与者成功执行了事务操作,反馈YES,表示事务可以执行;如果参与者没有成功执行事务,反馈NO,表示事务不可以执行。
阶段二:执行事务提交
- 执行事务提交:协调者返回的都是YES。
- 发送提交请求:协调者向所有参与节点发出Commit请求
- 事务提交参与者收到Commit请求后,执行事务提交操作,并在完成后释放占用的资源;
- 反馈提交结果:参与者在完成事务提交之后,向协调者发送ACK消息。
- 完成事务:协调者收到所有ACK后,完成事务。
- 中断事务:在第一个阶段任何一个参与者反馈了NO或者等待超时后然无法收到响应,就中断事务。
- 发送回滚请求。协调者向参与者发送RollBack请求
- 事务回滚。参与者接收到Rollback请求后,会利用Undo信息执行回滚操作,并释放占用的资源。
- 反馈事务回滚结果
- 中断事务。协调者接收到所有参与者的Ack消息后,完成事务中断。
优缺点
优点:原理简单,实现方便。
缺点:
- 同步阻塞。在两阶段提交过程中,所有参与者事务操作都处于阻塞状态,各个参与者在等待其他参与者响应。
- 单点问题。
- 数据不一致。
3PC
3PC即三阶段提交,其将二阶段提交协议的“提交事务请求”的过程一分为二,形成了CanCommit、PreCommit和DoCommit三个阶段。
阶段一:CanCommit
- 事务询问。协调者向所有参与者发送包含事务内容的canCommit请求,询问是否可以执行事务提交操作。
- 参与者向协调者反馈事务询问的响应。如果可以顺利执行反馈YES,否则反馈NO响应。
阶段二:PreCommit
该阶段协调者根据参与者的反馈决定是否可以顺利进行事务的PreCommit操作。
- 执行事务预提交(所有参与者返回YES)
- 发送预提交请求。协调者向所有参与者发出preCommit请求,并进入Prepared阶段。
- 事务预提交。参与者接收到preCommit请求后执行事务操作,并将Undo和Redo信息记录到事务日志中
- 各参与者向协调者反馈事务执行的响应。如果参与者成功提交了事务操作,返回ACK,同时等待最终指令:提交(Commit)或中止(abort)。
- 中断事务(任何一个参与者返回NO或者超时)
- 协调者发送中断(abort)请求
- 参与者中断事务。(协调者发送abort或者参与者等待超时)
阶段三:doCommit
- 执行提交
- 协调者从preCommit状态转换到“提交”状态,并向所有的参与者发送doCommit请求。
- 参与者接收到doCommit请求后,执行事务提交
- 参与者向协调者发送ACK消息。
- 协调者接收到所有参与者的反馈ACK消息后,完成事务。
- 中断事务(参与者向协调者反馈NO或者等待超时)
- 协调者发送中断请求
- 事务回滚。
- 反馈事务回滚结果。
- 中断事务。
需要注意的是,一旦进入阶段三不论协调者出现问题还是协调者与参与者网络之间的故障,最终都会导致参与者无法及时收到来自协调者大额doCommit或者Abort请求,针对这种异常情况,参与者在等待超时后,继续进行事务的提交。
和二阶段提交协议相比,三阶段提交协议最大的优点就是降低了参与者的阻塞返回,并且能够在出现单点故障后继续达成一致。
不忘初心,方得始终