ZooKeeper - 2PC、3PC协议

2pc two-phase commit
事务处理中,使节点能够保持一致性和原子性的一种算法。


事务请求阶段:
1.事务询问。协调者向所有参与者发送事务内容,询问参与者是否可以执行提交事务,等待参与者对此作出响应。
2.执行事务。参与者执行事务操作。将undo 和 redo 记录在事务日志中。
3.响应询问。参与者成功执行了事务,就会发出yes响应,表示可以提交事务;反之,会发出no响应。表示不可以提交事务。

事务提交阶段:
协调者向所有的参与者发送提交事务的请求。
参与者收到事务信息后,执行事务提交,提交事务后向协调者发送ack信息作为响应。
如果所有的参与者发送的都是yes的响应,协调者则提交事务。
只要有一个参与者反馈的是no响应或者等待超时后,协调没有得到所有参与者的响应,就会执行事务中断。
协调者向所有参与者发送中断事务请求,参与者利用undo记录的信息进行数据回滚,释放所有在事务执行阶段占用的资源并向协调者反馈ack信息。协调者接收到所有的参与者的ack信息后,完成事务中断。

缺点:单点问题,同步阻塞,数据一致性,缺少完善的容错机制。


3pc - three phase commit

1. canCommit。协调者向所有参与者发送事务的内容,询问是否可以提交事务。并等待所有的参与者做出响应。参与者接收到请求后,如果自身认为可以顺利执行事务,就会发送oK,进入预备状态,否则反馈no响应。
2. preCommit。协调者收到的所有参与者的响应都是yes时,进行事务预提交,向所有参与者发送事务预提交的请求。参与者收到请求后,执行事务预提交,将redo和undo写入到事务日志中。执行成功后,向协调者发送ack信息。一旦协调者收到no响应或者等待超时后,没有收到全部的参与者响应,进入中断阶段。协调者发送中断请求,或者等待协调者发送中断请求超时,参与者都会执行中断。
3. doCommit。协调者收到所有的参与者的ack信息后。发送提交请求。参与者执行事务提交,并发送ack信息,告知协调者事务执行完毕。一旦协调者没有收到全部的ack信息或者等待超时后,执行中断请求。参与者利用记录的undo信息执行事务回滚。之后释放事务执行阶段占用的资源。所有的参与者向协调者发送ack信息,最后协调者中断事务。


优点:解决了单点阻塞问题。
缺点:三阶段,遇到协调者无法向参与者发送提交或者中断事务信息或者等待超时,参与者都会执行事务提交操作。造成数据不一致。

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/84503353