聊聊ZAB(二)

2021-03-21  本文已影响0人  lucasgao

为什么引入新的协议(对比)

这个时候paxos总是被吊出来

我们知晓目前有一个比较好的候选算法:paxos。它可以提供一系列重要的特性,比如

但是,对用对paxos研究,我们发现可以简化paxos协议以获得更高的吞吐。

首先,paxos是允许消息丢失和重排的。但是,如果我们采用TCP通信的话,我们就可以保证所有交付的消息都是FIFO。这样我们就可以保证同时多个提案的因果有序。但是paxos因为没有FIFO实现,所以也就不能保证因果有序。

其次,在paxos中,为了减少竞争,我们一般只有一个提议者。这个提议者就是leader。当paxos从leader崩溃恢复之后,新的leader需要确保所有部门交付的消息完全交付。然后按照之前的提案编号进行提案。因为多个leader可以给同一个事务(实例)进行提案,就会出现以下2个问题:

那么ZAB为了避免以上的问题,他保证针对一个消息提案只能有一个编号,这就简化了选票和恢复的过程。在paxos中,如果一个服务认为自己是leader,那么他就会用一个更高的选票编号去获取leader地位。但是ZAB中,新的leader是需要在得到其他大多数服务认可之后才可以做leader的。

在ZAB中我们使用固定的计数器,由leader维护,并且leader负责跟其他follower服务同步。但是这个固定计数器不能再所有服务上启用,以达到负载均衡。但是我们还是采用了这种方法,因为以下的原因:

使用一个leader要求我们需要处理 leader故障以保证服务可用。这里采用的是 一些与视图变化相关的技术,比如Keidar and Dolev协议[10]。但是与其不同的是, zab不使用群组通信。并且服务的加入与离开,不会导致视图变更。除非是leader崩溃。

上一篇下一篇

猜你喜欢

热点阅读