从Paoxs算法与Zab协议关系讲起:共识与一致性的区别和联系

paxos算法是一组共识算法的集合,包含basic paxos,multi-paxos等。

basic paxos 算法有难以实现,两次RPC提交,容易出现活锁的缺点。二次提交中prepare的目的其实就是多个proposer通过条件约束(比如accept承诺不回应<=N提案等)尽可能达成共识,然后令多数派通过批准(虽然有可能发生活锁,通过加入随机睡眠可以很容易解决)。假如直接进入accept阶段,就会缺少prepare的回复之前的值,给予修正value值的机会,比如第二个用户序号为N+1,按照承诺应该批准,但是N+1号议案内容极有可能和N号议案不同,这也就违背了paxos算法的约束:一次paxos算法只能批准一个value。

如果proposer只有一个,那么该者提出的议案肯定会被批准,所以prepare阶段可以省略,直接进入批准阶段,消息延迟也减少一半。加入存在多个proposer,可以通过选举产生一个leader,然后所有议案只能通过leader来提出,这就是multi-paxos。以multi-paxos为基础的算法有许多,比如raft算法以及zab协议。比如zab协议,把proposer accepter learner多个角色合并到一个实例中,通过选举选出一个leader来提出数据更新同步的议案。

到这一步仅仅是达到了数据共识,如果要做到数据一致,还需要client的参与。在数据更新提案请求批准时,只要多数派回应,leader就决定提交,但是读的时候还是有可能会读出多种结果,所以这里就需要通过某种机制来读取正确数据,比如从多数派读取数据

你可能感兴趣的:(分布式,分布式)