标签:阻塞 实践 反馈 大于 一致性 null 过程 单点故障 数据不一致
2pc解决的是分布式事务问题。
2pc分为提交事务请求阶段和执行事务提交。
1.1 协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,等待响应或超时
1.2 各参与者执行事务操作,写入undo和redo日志
1.3 参与者返回响应
2.1 事务提交
如果阶段一参与者返回的都是yes响应,则执行事务提交
2.1.1 协调者发送事务提交请求
2.1.2 参与者执行commit操作
2.1.3 参与者返回ack消息
2.1.4 协调者接收到ack消息,事务完成
2.2 中断事务
如果阶段一任一参与者返回no响应,或协调者在等待参与者响应超时,将中断事务
2.2.1 协调者发送rollback请求
2.2.2 参与者利用1.2的undo日志执行rollback
2.2.3 参与者返回ack
2.2.4 协调者接收到ack,完成事务中断
3pc是2pc的改进版,将2pc的阶段一提交事务请求一分为二,形成canCommnit、preCommit、doCommit。
1.1 协调者向参与者发送事务内容,询问是否可以执行,等待响应
1.2 参与者判断是否可以执行,反馈yes或no
如果协调者收到的都是yes响应,则执行事务预提交。
2.1 协调者发送preCommit请求
2.2 参与者执行事务操作,写入undo和redo日志
2.3 参与者反馈ack,等待doCommit请求
如果任一参与者返回no,或者协调者等待超时,则向所有参与者发送中断事务请求;如果一个参与者在等待协调者preCommit超时,将中断事务。
协调者接收到所有ack请求,则执行提交
3.1 协调者发送doCommit请求
3.2 参与执行事务提交,反馈ack
3.3 完成事务
如果任一参与者返回no,或者协调者等待超时,则向所有参与者发送rollback请求;如果一个参与者在等待协调者doCommit超时,将自动执行commit操作。
3pc相对于2pc,在参与者引入了超时操作,减少了阻塞同时解决的单点问题。
但3pc也存在数据不一致问题,在阶段三,参与者在等待doCommit时,协调者给部分参与者发送了rollBack请求,随后故障,那么剩下的参与者将自动commit。
paxos是一种基于消息传递且具有高度容错特性的一致性算法,且是目前公认的解决分布式一致性问题最有效的算法之一。
paxos解决的是如何在集群内部对某个数据的值达成一致。
阶段一:
proposerA向acceptor发送prepare(1)的请求,acceptorX和acceptorY接收并返回ok,同时承诺不接受小于1的请求;
这时proposerB向acceptor发送prepare(2)的请求,acceptorX/Y/Z都接收并返回ok,同时承诺不接受小于2的请求;
到这时proposerA的prepare(1)才到达acceptorZ,但acceptorZ已经不接收小于2的请求,于是抛弃请求。
proposerA接收到acceptorX/Y的响应超过一半,但提案为null,于是发送acceptor([1,2])的请求给acceptor,但acceptor已经不接收小于2的请求,于是抛弃;
proposerB同样发送acceptor([2,4])的请求,acceptorX/Y接收并批准该提案,acceptorZ由于各种原因没有接收到,但批准已超过一半,于是提案成立。
如果acceptorA和acceptorB依次请求prepare,那就陷入死循环。
为了避免以上主循环,必须选取一个主proposer,规定只有主proposer才能提出提案。
主proposer的选举可以用paxos,上述问题用失败休眠随机时间减少冲突。
从Paxos到Zookeeper 分布式一致性原理与实践
https://angus.nyc/2012/paxos-by-example/
https://www.cnblogs.com/hugb/p/8955505.html
标签:阻塞 实践 反馈 大于 一致性 null 过程 单点故障 数据不一致
原文地址:https://www.cnblogs.com/wuweishuo/p/10640015.html