Zookeeper 选取机制与工作流程原理解析

1、集群角色描述

Zookeeper 集群分为三大角色:
(1)领导者(Leader);
(2)学习者(Learner):学习者又分为 跟随者(Follower)和 观察者(Observer);
(3)客户端(Client)。

角色描述
领导者(Leader)领导者负责投票的发起和决议,更新系统状态
跟随者(Follower)Follower 用于接收客户请求并向客户端返回结果,在选主过程中参与投票
观察者(Observer)Observer 可以接收客户端连接,将写请求转发给 Leader 节点,但 Observer 不参与投票过程,只同步 Leader 的状态。Observer 的目的是为了扩展系统,提高读取速度
客户端(Client)请求发起方

在这里插入图片描述

2、ZooKeeper 的选举机制

2.1、核心----选举算法,Paxos 算法概述(ZAB 协议)

Paxos 算法是莱斯利•兰伯特(英语:Leslie Lamport)于 1990 年提出的一种基于消息传递且具有高度容错特性的一致性算法。

分布式系统中的节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。

基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:
进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复,在基础 Paxos 场景中,先不考虑可能出现消息篡改,即拜占庭错误(Byzantine failure,即虽然有可能一个消息被传递了两次,但是绝对不会出现错误的消息)的情况。
Paxos 算法解决的问题是在一个可能发生上述异常的分布式系统中如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏决议一致性。

Paxos 算法使用一个希腊故事来描述,在 Paxos 中,存在三种角色,分别为:
(1)Proposer(提议者,用来发出提案 proposal);
(2)Acceptor(接受者,可以接受或拒绝提案);
(3)Learner(学习者,学习被选定的提案,当提案被超过半数的 Acceptor 接受后为被批准)。

下面是更精确的定义 Paxos 要解决的问题:
(1)决议(value)只有在被 proposer 提出后才能被批准;
(2)在一次 Paxos 算法的执行实例中,只批准(chose)一个 value;
(3)learner 只能获得被批准(chosen)的 value。

**ZooKeeper 的选举算法有两种:
(1)一种是基于 Basic Paxos(Google Chubby 采用)实现的;
(2)另外一种是基于 Fast Paxos(ZooKeeper 采用)算法实现的。
系统默认的选举算法为 Fast Paxos。并且 ZooKeeper 在 3.4.0 版本后只保留了 FastLeaderElection 算法。
**

ZooKeeper 的核心是原子广播,这个机制保证了各个 Server 之间的同步。
实现这个机制的协议叫做 ZAB 协议(Zookeeper Atomic BrodCast)
ZAB 协议有两种模式,它们分别是:
(1)崩溃恢复模式(选主);
(2)原子广播模式(同步)。

2.2、Basic Paxos 流程

了解 Basic Paxos 流程之前我们先大致看下 ZooKeeper 集群选举状态:
(1)当服务启动或者在领导者崩溃后,ZAB 就进入了恢复模式,当领导者被选举出来,且大多数 Server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 follower 之间具有相同的系统状态。

(2)当 ZooKeeper 集群选举出 leader 同步完状态退出恢复模式之后,便进入了原子广播模式。所有的写请求都被转发给 leader,再由 leader 将更新 proposal 广播给 follower。

为了保证事务的顺序一致性,zookeeper 采用了递增的事务 id 号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了 zxid。实现中 zxid 是一个 64 位的数字,它高 32 位是 epoch 用来标识 leader 关系是否改变,每次一个 leader 被选出来,它都会有一个新
的 epoch,标识当前属于那个 leader 的统治时期。低 32 位用于递增计数。

这里给大家介绍以下 Basic Paxos 流程:
(1)选举线程由当前 Server 发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的 Server;
(2)选举线程首先向所有 Server 发起一次询问(包括自己);
(3)选举线程收到回复后,验证是否是自己发起的询问(验证 zxid 是否一致),然后获取对方的 serverid(myid),并存储到当前询问对象列表中,最后获取对方提议的 leader 相关信息(serverid,zxid),并将这些信息存储到当次选举的投票记录表中;
(4)收到所有 Server 回复以后,就计算出 id 最大的那个 Server,并将这个 Server 相关信息设置成下一次要投票的 Server;
(5)线程将当前 id 最大的 Server 设置为当前 Server 要推荐的 Leader,如果此时获胜的 Server获得 n/2 + 1 的 Server 票数, 设置当前推荐的 leader 为获胜的 Server,将根据获胜的 Server 相关信息设置自己的状态,否则,继续这个过程,直到 leader 被选举出来。

通过流程分析我们可以得出:
要使 Leader 获得多数 Server 的支持,则 Server 总数必须是奇数 2n+1,且存活的 Server 的数目不得少于 n+1。

每个 Server 启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的 server 还会从磁盘快照中恢复数据和会话信息,zk 会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。

Fast Paxos 流程是在选举过程中,某 Server 首先向所有 Server 提议自己要成为 leader,当其它 Server 收到提议以后,解决 epoch 和 zxid 的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出 Leader。

2.3、ZooKeeper 的全新集群选主

以一个简单的例子来说明整个选举的过程:
假设有五台服务器组成的 zookeeper 集群,它们的 server.id 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么:
(1)服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是 LOOKING 状态;
(2)服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持 LOOKING 状态;
(3)服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1,2,3 中的老大,而与上面不同的是,此时有三台服务器(超过半数)选举了它,所以它成为了这次选举的 leader;
(4)服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1,2,3,4 中最大的,但是由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命了;
(5)服务器 5 启动,同 4 一样,当小弟。

总结:zookeeper server 的三种工作状态:
LOOKING:当前 Server 不知道 leader 是谁,正在搜寻,正在选举;
LEADING:当前 Server 即为选举出来的 leader,负责协调事务;
FOLLOWING:leader 已经选举出来,当前 Server 与之同步,服从 leader 的命令。

2.4、ZooKeeper 的非全新集群选主

那么,初始化的时候,是按照上述的说明进行选举的,但是当 zookeeper 运行了一段时间之后,有机器 down 掉,重新选举时,选举过程就相对复杂了。

需要加入数据 version、serverid 和逻辑时钟。
数据 version:数据是新的话 version 就大,数据每次更新都会更新 version;
server id:就是我们配置的 myid 中的值,每个机器一个;
逻辑时钟:这个值从 0 开始递增,每次选举对应一个值,也就是说:如果在同一次选举中,那么这个值应该是一致的;逻辑时钟值越大,说明这一次选举 leader 的进程更新,也就是每次选举拥有一个 zxid,投票结果只取 zxid 最新的。

**
选举的标准就变成:
(1)逻辑时钟小的选举结果被忽略,重新投票;
(2)统一逻辑时钟后,数据 version 大的胜出;
(3)数据 version 相同的情况下,server id 大的胜出根据这个规则选出 leader。
**

3、数据同步

选完 leader 以后,zk 就进入状态同步过程:
(1)leader 等待 server 连接;
(2)follower 连接 leader,将最大的 zxid 发送给 leader;
(3)leader 根据 follower 的 zxid 确定同步点;
(4)完成同步后通知 follower 已经成为 uptodate 状态;
(5)follower 收到 uptodate 消息后,又可以重新接受 client 的请求进行服务了。

以下是流程图:
在这里插入图片描述

4、ZooKeeper 工作流程

4.1、Leader 工作流程

Leader 主要有三个功能:
(1)恢复数据;
(2)维持与 Learner 的心跳,接收 Learner 请求并判断 Learner 的请求消息类型;
Learner 的消息类型主要有:
PING 消息:Learner 的心跳信息;
REQUEST 消息:Follower 发送的提议信息,包括读写请求;
ACK 消息:Follower 对提议的回复,超过半数的 Follower 通过,则 commit 该提议;
REVALIDATE 消息:用来延长 SESSION 有效时间。
(3)根据不同的消息类型,进行不同的处理。

4.2、Follower 工作流程

Follower 主要有四个功能:
(1)向 Leader 发送请求(PING 消息、REQUEST 消息、ACK 消息、REVALIDATE 消息);
(2)接收 Leader 消息并进行处理;
(3)接收 Client 的请求,如果为写请求,则转发给 Leader;
(4)返回 Client 结果。

Follower 的消息循环处理如下几种来自 Leader 的消息:
(1)PING 消息: 心跳消息;
(2)PROPOSAL 消息:Leader 发起的提案,要求 Follower 投票;
(3)COMMIT 消息:服务器端最新一次提案的信息;
(4)UPTODATE 消息:表明同步完成;
(5)REVALIDATE 消息:根据 Leader 的 REVALIDATE 结果,关闭待 revalidate 的 session 还是允许其接受消息;
(6)SYNC 消息:返回 SYNC 结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

4.3、Observer 工作流程

Observer 流程和 Follower 的唯一不同的地方就是 Observer 不会参加 Leader 发起的投票,也不会被选举为 Leader,所以不重复描述了。

5、学习内容

上节学习内容:ZooKeeper 集群使用(Cli and JavaAPI)
下节学习内容:Zookeeper 应用案例(一)之服务器上下线动态感知

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值