其他分享
首页 > 其他分享> > Zookeeper原理

Zookeeper原理

作者:互联网

本文主要内容如下:

1 Paxos

Zookeeper不管是leader选举,还是广播模式使用的都是paxos协议,确切来说是paxos协议的变种,所以我们首先了解一下Paxos。

1.1 分布式系统数据一致性问题

在基于消息投递的分布式系统中,可能存在参与者处理速度非常慢,宕机、重启、网络不稳定等的问题,从而导致消息可能会延迟、丢失或者重复。Paxos就是要解决分布式系统在上述任意异常情况下均能保持一致性的一个协议。
需要说明的是,此协议假设消息投递过程中不存在拜占庭问题,即消息不会出错。

1.2 故事

Lamport是通过故事的方式提出Paxos,故事如下;希腊岛屿Paxon 上的执法者(legislators)在议会大厅(chamber)中表决通过法律,并通过服务员传递纸条的方式交流信息,每个执法者会将通过的法律记录在自己的账目(ledger)上。问题在于执法者和服务员都不可靠,他们随时会因为各种事情离开议会大厅,并随时可能有新的执法者进入议会大厅进行法律表决,使用何种方式能够使得这个表决过程正常进行,且通过的法律不发生矛盾。

1.3 语义定义

1.3.1 角色

算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色。

1.3.2 基本语义

决议(value)只有在被proposers提出后才能被批准,未经批准的决议称为"提案(proposal)"。
在一次Paxos算法的执行实例中,只批准(chosen)一个value。
learners只能获得被批准(chosen)的value。

1.3.3 决议过程

通过一个决议分为两个阶段:Prepare阶段、Accepet阶段

1.3.3.1 prepare阶段

当Porposer希望提出方案V1,首先发出prepare请求至大多数Acceptor。Prepare请求内容为序列号;
当Acceptor接收到prepare请求时,检查自身上次回复过的prepare请求

1.3.3.2 accept阶段

Porposer经过一段时间,收到一些Acceptor回复,回复可分为以下几种:
回复数量满足多数派,并且所有的回复都是,则Porposer发出accept请求,请求内容为议案<SN1,V1>;
回复数量满足多数派,但有的回复为:<SN2,V2>,<SN3,V3>……则Porposer找到所有回复中超过半数的那个,假设为<SNx,Vx>,则发出accept请求,请求内容为议案<SN1,Vx>;
回复数量不满足多数派,Proposer尝试增加序列号为SN1+,转1继续执行;
Acceptor在不违背自己向其他Proposer的承诺的前提下,Acceptor收到accept请求后即接受并回复这个请求。

1.3.4 约束

根据上面的三个语义可演化为四个约束。(说明:P1表示prepare阶段;P2表示accept阶段).

1.4 缺点与简化

1.4.1 缺点

Paxos算法在出现竞争的情况下,其收敛速度很慢,甚至可能出现活锁的情况。例如当有三个及三个以上的proposer在发送prepare请求后,很难有一个proposer收到半数以上的回复,从而导致不断地执行第一阶段的协议。

1.4.2 简化

为了避免竞争,加快收敛的速度,在算法中引入了一个Leader这个角色,在正常情况下同时应该最多只能有一个参与者扮演Leader角色,而其它的参与者则扮演Acceptor的角色,同时所有的人又都扮演Learner的角色。
Multi-Paxos协议是经典的Paxos协议的简化版本,有谷歌公司的工程师所提出。二者最大的差别是Multi-Paxos包含有leader节点而Paxos没有。像chubby、zookeeper、megastore、spanner等中间件都是使用Multi-Paxos。
Multi Paxos先运行一次完整的paxos算法选举出leader,有leader处理所有的写请求,然后省略掉prepare过程。并由这个Leader唯一地提交value给各Acceptor进行表决。

2 Zookeeper原理

2.1 角色

角色描述
Leader主要负责投票的发起和决议;系统状态更新
Learner-Follower参与投票过程,写请求转发给leader;接收客户端连接
Learner-Observer不参与投票过程,写请求转发给leader;接收客户端连接。增加系统扩展性、读性能。
Client请求发起方

Leader将状态变化发送给follower和observer。写操作的吞吐率取决于仲裁数量的大小,更大的仲裁数量,将导致更小的写操作吞吐率。引入observer的一个主要原因是提高读请求的扩展性,Observer不参与投票过程,所以对于写操作没有开销,同时因为保持和leader同步,所以可以支持更多读请求。

2.2 集群结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbAN74WE-1624859190341)(img/Zookeeper原理/集群结构.png)]
注:此图来自网络。

2.3 特性

2.4 原子广播协议(ZAB)

Zookeeper通过ZAB保证多个server之间的数据同步。
Zab协议分为:恢复模式(选主)和广播模式(同步)。当服务启动或者在leader崩溃后,Zab就进入了恢复模式,当leader被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了,接下来就进入广播模式。

3 Zookeeper设计

本部分将简要介绍Zookeeper的实现原理,详细内容见其他博客。

3.1 QuorumPeer模型

在这里插入图片描述

QuorumPeer是zookeeper server的核心,主要负责以下内容:

3.2 leader选举

在这里插入图片描述

此图是简化的选举流程,只是用来标明主要过程,详细流程参考博客。
选举过程其实是Paxos协议执行的过程,选主过程如下:

3.3 Lead流程在这里插入图片描述

如图所示,leader主要负责以下内容:

3.4 followLeader流程

在这里插入图片描述

如图所示,follower主要负责以下内容:

3.5 Leader广播模式

在这里插入图片描述

如上图所示,leader在广播模式下承担的职责主要包括:

3.6 follower广播模式

在这里插入图片描述

如上图所示,follower在广播模式下承担的职责主要包括:

4 Zookeeper请求的处理

Zookeeper在是现实使用的主要抽象概念是请求处理器,请求处理器是对不同阶段处理过程的一个抽象,每个服务器注册了一个不同的请求处理器序列。

4.1 请求模型

在这里插入图片描述

此图来自Zookeeper官网文档,表示请求过程。所有的写请求都通过ZAB协议保持集群数据一致性。

4.2 leader

4.2.1 注册RequestProcessor链示例代码

4.2.1.1 LeaderZooKeeperServer#setupRequestProcessors
protected void setupRequestProcessors() {
    RequestProcessor finalProcessor = new FinalRequestProcessor(this);
    RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(
            finalProcessor, getLeader().toBeApplied);
    commitProcessor = new CommitProcessor(toBeAppliedProcessor,
            Long.toString(getServerId()), false,
            getZooKeeperServerListener());
    commitProcessor.start();
    ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
            commitProcessor);
    proposalProcessor.initialize();
    firstProcessor = new PrepRequestProcessor(this, proposalProcessor);
    ((PrepRequestProcessor)firstProcessor).start();
}
4.2.1.2 ZooKeeperServer#setupRequestProcessors
    protected void setupRequestProcessors() {
        RequestProcessor finalProcessor = new FinalRequestProcessor(this);
        RequestProcessor syncProcessor = new SyncRequestProcessor(this,
                finalProcessor);
        ((SyncRequestProcessor)syncProcessor).start();
        firstProcessor = new PrepRequestProcessor(this, syncProcessor);
        ((PrepRequestProcessor)firstProcessor).start();
    }

4.2.2 模型

在这里插入图片描述

4.2.3 分析

public void processRequest(Request request) throws RequestProcessorException {
    /* In the following IF-THEN-ELSE block, we process syncs on the leader. 
     * If the sync is coming from a follower, then the follower
     * handler adds it to syncHandler. Otherwise, if it is a client of
     * the leader that issued the sync command, then syncHandler won't 
     * contain the handler. In this case, we add it to syncHandler, and 
     * call processRequest on the next processor.
     */
    if(request instanceof LearnerSyncRequest){
        zks.getLeader().processSync((LearnerSyncRequest)request);
    } else {
            nextProcessor.processRequest(request);
        if (request.hdr != null) {
            // We need to sync and get consensus on any transactions
            try {
                zks.getLeader().propose(request);
            } catch (XidRolloverException e) {
                throw new RequestProcessorException(e.getMessage(), e);
            }
            syncProcessor.processRequest(request);
        }
    }
}

4.3 follower

4.3.1 注册RequestProcessor链示例代码

FollowerZooKeeperServer#setupRequestProcessors如下所示:

protected void setupRequestProcessors() {
    RequestProcessor finalProcessor = new FinalRequestProcessor(this);
    commitProcessor = new CommitProcessor(finalProcessor,
            Long.toString(getServerId()), true,
            getZooKeeperServerListener());
    commitProcessor.start();
    firstProcessor = new FollowerRequestProcessor(this, commitProcessor);
    ((FollowerRequestProcessor) firstProcessor).start();
    syncProcessor = new SyncRequestProcessor(this,
            new SendAckRequestProcessor((Learner)getFollower()));
    syncProcessor.start();
}

4.3.2 模型

在这里插入图片描述

4.3.3 分析

5 博客

我的相关博客
ZAB协议恢复模式-数据同步

ZAB协议恢复模式-Leader选举

Zookeeper原理

本文参考内容
Paxos算法与Zookeeper分析
http://blog.csdn.net/xhh198781/article/details/10949697
Paxos 算法
https://baike.baidu.com/item/Paxos%20%E7%AE%97%E6%B3%95/10688635?fr=aladdin

标签:请求,Zookeeper,follower,原理,提案,Paxos,leader
来源: https://blog.csdn.net/wuzhengfei1112/article/details/118301708