Paxos算法是一个分布式选举算法,用来解决一个分布式系统如何就某个值达成一致的问题(zookeeper没用这个,用的zab)
proposer 提出提案,提案信息包括提案编号和提议的value;
acceptor 收到提案后可以接受提案;
learner 只能学习被批准的提案;
它主要分为两个阶段:分别是prepare阶段和accept阶段。
阶段一(prepare阶段)
提案者选择一个提案编号N,然后向半数以上的接收者发送编号为N的prepare请求,如果该编号大于接收者已经批准过的最大编号,则返回最大编号的提案给提案者,同时承诺不再接受任何编号小于N的提案。
阶段二(accept阶段)
如果提案者收到了一半以上的响应,会发送一个[N,V]的accept请求给接收者。V就是编号最大的提案的值。当接收者收到accpet请求后,只要该接收者尚未收到编号大于N的prepare请求,就可以通过该提案。
Zab协议
zookeeper通过Zab协议保证集群的数据一致性,Zab协议是为zookeeper专门设计的一种支持崩溃恢复的原子广播协议,有两种模式,当服务启动或者leader挂掉后,进入恢复模式,选举leader,当leader被选举出来,且大多数follower完成了和 leader的同步以后,进入广播模式。
Leader 在收到一个写请求后,会将请求转换为事务,并为这个事务分配一个全局递增的唯一ID,即zxid,然后按顺序分发给每个 Follower。分发之后Leader 等待Follower 的 Ack 响应。当Leader 收到半数以上的Ack响应后,就会再次向Follower发送commit请求,然后Follower执行事务的提交。(类似于二段提交2PC,但是却又不同,二段提交要求Leader 收到所有Follower反馈的ACK后,才发送commit消息)