Zookeeper:Zookeeper的主从选举机制

ZAB 协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议),是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。当 Zookeeper 集群中的一台服务器出现以下两种情况之一时,需要进入 Leader 选举:(1)服务器初始化启动;(2)服务器运行期间 Leader 故障。

本篇内容包括:关于 ZAB 协议、Zookeeper 选主时机、Zookeeper 选主机制。


文章目录

    • 一、关于 ZAB 协议
        • 1、ZAB 协议简述
        • 2、ZooKeeper 集群中的三个服务器角色
    • 二、Zookeeper 选主时机
        • 1、ZooKeeper 服务器的工作状态
        • 2、Zookeeper 选主时机
        • 3、FOLLOWING 状态节点(Follower)的主流程
        • 4、LOOKING 状态节点的主流程
        • 5、LEADING 状态节点(Leader)的主流程
    • 三、Zookeeper 选主机制
        • 1、涉及到的相关概念
        • 2、Zookeeper 选举流程
        • 3、集团初始选举
        • 4、集群重新选举
        • 5、选举流程总结


一、关于 ZAB 协议

1、ZAB 协议简述

ZAB 协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议),是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。

作为分布式共识算法的一员,Zab 算法构成了著名的 ZooKeeper 的基石。与赫赫有名的 Paxos、Raft 一样,Zab 算法也提供了强一致性的保证。

从设计上看,ZAB 协议和 Raft 很类似。ZooKeeper 集群中,只有一个 Leader 节点,其余均为 Follower 节点。

2、ZooKeeper 集群中的三个服务器角色

Zookeeper 集群中的机器分为以下三种角色:

  • Leader:①、整个 Zookeeper 集群工作机制中的核心,过选举产生的集群领导者,提供读写服务;②、一个 Zookeeper 集群中同一时间只能有一个实际工作的 Leader,它用来维护各个 Follow 与 Observer 之间的心跳;③、Leader 是事务请求的唯一调度和处理者,Follow 接收到事务请求会将请求转发给 Leader 处理。
  • Follow:①、Follow 只提供读服务,即只处理非事务请求,它接收到事务请求会转发给 Leader 服务器;②、它参与 Leader 的选举,参与事务请求 Proposal 的投票;③、一个 Zookeeper 集群同时可以有多个 Follow。
  • Observer:①、功能和 Follow 基本一致,提供读服务,即只处理非事务请求,唯一的差别是不参与任何投票(包括事务请求 Proposal 和 Leader 的选举);②、Observer 的作用主要就是在不影响集群事务处理前提下提升集群的非事务处理。

二、Zookeeper 选主时机

1、ZooKeeper 服务器的工作状态

ZooKeeper 服务器有四种工作状态:

  1. LOOKING:竞选状态,寻找 Leader。当服务器处于该状态时,它会认为当前服务器没有 Leader,因此需要进入 Leader 选举状态。

  2. FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。

  3. LEADING:领导者状态。表明当前服务器角色是 Leader。

  4. OBSERVING:观察者状态。表明当前服务器角色是 Observer。

2、Zookeeper 选主时机

当 Zookeeper 集群中的一台服务器出现以下两种情况之一时,需要进入 Leader 选举:(1)服务器初始化启动;(2)服务器运行期间 Leader 故障。

  1. 服务器初始化启动:每个节点启动的时候状态都是 LOOKING,处于观望状态,接下来就是要进行选主了。
  2. 服务器运行期间 Leader 故障:Leader 节点运行后会周期性地向 Follower 发送心跳信息(称之为 ping)
    1. 如果一个 Follower 未收到 Leader 节点的心跳信息,Follower 节点的状态会从 FOLLOWING 转变为 LOOKING;
    2. Leader 节点也会检测 Follower 节点的状态,如果多数 Follower 节点不再响应 Leader 节点(可能是 Leader 节点与 Follower 节点之间产生了网络分区),那么 Leader 节点可能此时也不再是合法的 Leader 了,也必须要进行一次新的选主。

3、FOLLOWING 状态节点(Follower)的主流程

FOLLOWING 状态节点(Follower)的主流程:

void followLeader() throws InterruptedException {
try {......while (this.isRunning()) {readPacket(qp);processPacket(qp);}// 如果上面的 while 循环内出现异常// Ps:长时间没有收到 Leader 的消息也是异常
} catch (Exception e) {// 出现异常就退出了 while 循环// 也就结束了 Follower 的处理流程
}

4、LOOKING 状态节点的主流程

LOOKING 状态节点的主流程:

public void run() {while (running) {switch (getPeerState()) {case FOLLOWING:try {setFollower(makeFollower(logFactory));follower.followLeader();} catch (Exception e) {......} finally {follower.shutdown();setFollower(null);// 状态更新为 LOOKINGupdateServerState();}break;......}
}

5、LEADING 状态节点(Leader)的主流程

在 Leader 节点的主循环流程中,会判断多数派节点的消息状态,如下:

void lead() throws IOException, InterruptedException {......while (true) {......// 判断每个每个 Follower 节点的状态// 是否与 Leader 保持同步for (LearnerHandler f : getLearners()) {if (f.synced()) {   syncedAckSet.addAck(f.getSid());}}......}if (!tickSkip && !syncedAckSet.hasAllQuorums()) {// 如果失去了大多数 Follower 节点的认可,就跳出 Leader 主循环,进入选主流程break;}......
}// LearnerHandler::synced() 逻辑
// 即判断当前是否已经过了期望得到的 Follower 的下一个消息的期限:tickOfNextAckDeadline
public boolean synced() {return isAlive() && leader.self.tick.get() <= tickOfNextAckDeadline;
}

三、Zookeeper 选主机制

1、涉及到的相关概念

# Server id(myid 或 sid):服务器 ID

比如有三台服务器,编号分别是 1,2,3。编号越大在选择算法中的权重越大,比如初始化启动时就是根据服务器 ID 进行比较。

# Zxid:事务ID

服务器中存放的数据的事务 ID,值越大说明数据越新,在选举算法中数据越新权重越大。

zxid 有两部分组成:高 32位 是 epoch,低 32位 是 epoch 内的自增 id,由 0 开始。每次选出新的 Leader,epoch 会递增,同时 zxid 的低 32 位清 0

# Epoch:逻辑时钟

也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。

2、Zookeeper 选举流程

选举大致流程:

  • 初始投票:服务器启动后,每个 Server 都会给自己投上一票,每次投票会包含所投票服务器的 myid 和 zxid
  • 同步投票结果:集群中的服务器在投票后,会将各自的投票结果同步给集群中其他服务器。
  • 检查投票有效性:各服务器在收到投票后会检查投票的有效性,如:是否本轮投票,是否来自 LOOKING 状态的服务器的投票等。
  • 处理投票:服务器之间会进行投票比对,规则如下:①、优先检查 zxid,较大的服务器优先作为 Leader;②、如果 zxid 相同,则 myid 较大的服务器作为 Leader;
  • 统计投票结果:每轮投票比对之后都会统计投票结果,确认是否有超过半数的机器都得到相同的投票结果,如果是,则选出 Leader,否则继续投票。
  • 更改服务器状态:一旦选出 Leader,每个服务器就会各自更新自己的状态

3、集团初始选举

假设我们有服务器 1~5,服务器初始化启动选主流程(粗略版):

  1. 「服务器1」启动,发起一次选举。「服务器1」投自己一票。此时「服务器1」票数一票,不够半数以上(3票),选举无法完成,「服务器1」状态保持为 LOOKING
  2. 「服务器2」启动,再发起一次选举。「服务器1」和「服务器2」分别投自己一票并交换选票信息;此时「服务器1」发现「服务器2」的 myid 比自己目前投票推举的「服务器1」大,更改选票为推举「服务器2」。此时「服务器1」票数 0 票,服「务器2」票数 2 票,没有半数以上结果,选举无法完成,「服务器1」,「服务器2」保持 LOOKING
  3. 「服务器3」启动,发起一次选举。此时「服务器1」和「服务器2」都会更改选票为「服务器3」。此次投票结果:「服务器1」、「服务器2」为 0。票,「服务器3」为 3。票。此时「服务器3」的票数已经超过半数,「服务器3」当选成为 Leader。「服务器1」、「服务器2」更改状态为 FOLLOWING,「服务器3」更改状态为 LEADING
  4. 「服务器4」启动,发起一次选举。此时「服务器1,2,3」已经不是 LOOKING 状态,不会更改选票信息。交换选票信息结果:「服务器3」为 3 票,「服务器4」为 1 票。此时「服务器4」服从多数,更改选票信息为「服务器3」,并更改状态为 FOLLOWING
  5. 「服务器5」同「服务器4」。

4、集群重新选举

Zookeeper 集群运行期间无法和 Leader 保持正常连接时,即如果 Leader 挂了,或者 Leader 服务器故障都会进行新一轮的 Leader 选举。需要重新选举时,选举过程就需要加入数据 id,服务器id,和逻辑时钟。

img

集群重新选举时,根据 myid 和 zxid 的大小共同决断,zxid 更大的优先成为 Leader,选举的标准(粗略版):

  • 逻辑时钟小的选举结果会被忽略,重新投票;
  • 统一逻辑时钟后,事务 id 大的胜出,当选 Leader;
  • 事务 id 相同的情况下,服务器 id 大的胜出,当选 Leader。

5、选举流程总结

总结:Zookeeper 集群按 myid 从小到大依次启动初始化时,在超过半数机器的投票的情况下,谁的 myid 最后,谁就是 Leader,知道这个定律,不同的集群规模我们都可以推算出谁是 Leader。

# 集群初始化时:

  • 集群有 3 台机器,第 2 大的 myid 所在服务器就是 Leader
  • 集群有 4 台机器,第 3 大的 myid 所在服务器就是 Leader;
  • 集群有 5 台机器,第 3 大的 myid 所在服务器就是 Leader;
  • 集群有 6 台机器,第 4 大的 myid 所在服务器就是 Leader;

集群重新选举时,根据 myid 和 zxid 的大小共同决断,zxid 更大的优先成为 Leader。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源&#xff0c;使得一个宿主机可拥有多个主机名或Domain Name。换句话说&#xff0c;可让不同namespace中的进程看到不同的主机名。 例如&#xff0c;使用unshare命令(较新版本L…

Kubernetes 的原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 kuberne…

CPU 是如何执行任务的

前言 你清楚下面这几个问题吗&#xff1f; 有了内存&#xff0c;为什么还需要 CPU Cache&#xff1f; CPU 是怎么读写数据的&#xff1f; 如何让 CPU 能读取数据更快一些&#xff1f; CPU 伪共享是如何发生的&#xff1f;又该如何避免&#xff1f; CPU 是如何调度任务的&a…

Ansible 的自动化运维

1、Ansible 特点 Ansible 自 2012 年发布以来&#xff0c;很快在全球流行&#xff0c;其特点如下&#xff1a; Ansible 基于 Python 开发&#xff0c;运维工程师对其二次开发相对比较容易&#xff1b; Ansible 丰富的内置模块&#xff0c;几乎可以满足一切要求&#xff1b; …

图文并茂 VLAN 详解,让你看一遍就理解 VLAN

一、为什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN)&#xff0c;翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 在此让我们先复习…

认识VLAN,并学会VLAN的划分和网络配置实例

VLAN的划分和网络的配置实例 1、VLAN基础知识 VLAN&#xff08;Virtual Local Area Network&#xff09;的中文名为&#xff1a;“虚拟局域网”&#xff0c;注意和VPN&#xff08;虚拟专用网&#xff09;进行区分。 VLAN是一种将局域网设备从逻辑上划分&#xff08;不是从物…

VLAN划分及配置注意事项

VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接通信&#xff0c;从而将广播报文限制在一个VLAN内。VLAN之间的通信是通过第3…

Docker原理剖析

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff0c;而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&#…

Docker容器网络解析

Docker 容器网络的发展历史 在 Dokcer 发布之初&#xff0c;Docker 是将网络、管理、安全等集成在一起的&#xff0c;其中网络模块可以为容器提供桥接网络、主机网络等简单的网络功能。 从 1.7 版本开始&#xff0c;Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来…

Docker 数据管理介绍

默认容器的数据是保存在容器的可读写层&#xff0c;当容器被删除时其上的数据也会丢失&#xff0c;所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据。官方提供了三种存储方式&#xff1a;Volumes、Bind mounts和tmpfs。前面还介绍了&#xff1a;Docker 服务终端…

Docker 数据持久化的三种方案

容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题&#xff1a; 数据不是持久化。意思是如果容器删除了&#xff0c;这些数据也就没了 主机上的其它进程不方便访问这些数据 对这些数据的I/O会经过存储驱动&#xff0c;然后到达主机&#xff0c;引入了一层间…

Git 存储原理及相关实现

Git 是目前最流行的版本控制系统&#xff0c;从本地开发到生产部署&#xff0c;我们每天都在使用 Git 进行我们的版本控制&#xff0c;除了日常使用的命令之外&#xff0c;如果想要对 Git 有更深一步的了解&#xff0c;那么研究下 Git 的底层存储原理将会对理解 Git 及其使用非…

Git内部原理

Git有什么特点&#xff1f; fast&#xff0c;scalable&#xff0c;distributed revision control system&#xff08;快速&#xff0c;可扩展的分布式版本控制系统&#xff09; 几乎所有操作都是本地执行 每一个clone都是整个生命周期的完整副本 the stupid content tracker&a…

详解设计模式:中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;也被称为调停者模式&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 中介者模式 是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支…

RPC 服务 与 HTTP 服务的区别

1、什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;—远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序之间携带信…

缓存雪崩、击穿、穿透解决方案

用户的数据一般都是存储于数据库&#xff0c;数据库的数据是落在磁盘上的&#xff0c;磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求&#xff0c;都访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就奔溃的了&#xff0c;所以为了避免用户直…

【Docker】容器镜像有哪些特性

首先解释一下什么是Docker镜像&#xff1f; Docker镜像它其实是一个模板&#xff0c;拥有这个模板我们才能创建我们的Docker容器&#xff0c;镜像里含有启动 docker 容器所需的文件系统结构及其内容&#xff0c;因此是启动一个 docker 容器的基础。docker 镜像的文件内容以及一…

nginx中的location指令

1、location 介绍 location是Nginx中的块级指令(block directive)&#xff0c;location指令的功能是用来匹配不同的url请求&#xff0c;进而对请求做不同的处理和响应&#xff0c;这其中较难理解的是多个location的匹配顺序&#xff0c;本文会作为重点来解释和说明。 开始之前…

容器底层实现技术Namespace/Cgroup

Docker容器实现原理 Docker容器在实现上是通过namespace技术来进行进程隔离&#xff0c;通过cgroup技术实现容器进程可用资源的限制&#xff0c;当docker启动一个容器时&#xff0c;实际是创建了多了namespace参数的进程。 Namespace Namespace&#xff1a;命名空间 作用&#…

异方差与多重共线性对回归问题的影响

异方差的检验 1.异方差的画图观察 2.异方差的假设检验&#xff0c;假设检验有两种&#xff0c;一般用怀特检验使用方法在ppt中&#xff0c;课程中也有实验&#xff0c;是一段代码。 异方差的解决办法 多重共线性 多重共线性可能带来的影响&#xff1a; 多重共线性的检验 多重…