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…

Zookeeper:事件监听和通知机制

Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听&#xff0c;当服务端的一些指定事件触发了这个 Watcher&#xff0c;服务端会向指定客户端发送一个事件通知来实现分布式的通知功能&#xff0c;然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变。 …

Linux namespace之:mount namespace

理解mount namespace 用户通常使用mount命令来挂载普通文件系统&#xff0c;但实际上mount能挂载的东西非常多&#xff0c;甚至连现在功能完善的Linux系统&#xff0c;其内核的正常运行也都依赖于挂载功能&#xff0c;比如挂载根文件系统/。其实所有的挂载功能和挂载信息都由内…

Linux namespace之:network namespace

理解network namespace network namespace用来隔离网络环境&#xff0c;「在network namespace中&#xff0c;网络设备、端口、套接字、网络协议栈、路由表、防火墙规则等都是独立的」。 因network namespace中具有独立的网络协议栈&#xff0c;因此每个network namespace中都…

Kubernetes 的原理

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

Zookeeper:实现“分布式锁”的 Demo

Zookeeper 能保证数据的强一致性&#xff0c;用户任何时候都可以相信集群中每个节点的数据都是相同的。一个用户创建一个节点作为锁&#xff0c;另一个用户检测该节点&#xff0c;如果存在&#xff0c;代表别的用户已经锁住&#xff0c;如果不存在&#xff0c;则可以创建一个节…

JavaIO流:案例

java.io 包下需要掌握的流有 16 个&#xff0c;本篇内容包括&#xff1a;java.io包下需要掌握的流、Java IO 案例。 文章目录一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1&#xff08;FileInputStream&#xff09;2、Demo 2&#xff08;FileInputStream&#xff09;3…

比对excel数据

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/测算单位设置/比对/吉林/tmp001.xlsx bD:/测算单位设置/比对/吉林/国网吉林电力.xlsx cD:/测算单位设置/比对…

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; …

Shell 信号发送与捕捉

1、Linux信号类型 信号&#xff08;Signal&#xff09;&#xff1a;信号是在软件层次上对中断机制的一种模拟&#xff0c;通过给一个进程发送信号&#xff0c;执行相应的处理函数。 进程可以通过三种方式来响应一个信号&#xff1a; 1&#xff09;忽略信号&#xff0c;即对信…

运维面试题总结

集群相关 简述 ETCD 及其特点&#xff1f; etcd 是 CoreOS 团队发起的开源项目&#xff0c;是一个管理配置信息和服务发现&#xff08;service discovery&#xff09;的项目&#xff0c;它的目标是构建一个高可用的分布式键值&#xff08;key-value&#xff09;数据库&#x…

详解设计模式:建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;也叫做生成器模式&#xff0c;是 GoF 的 23 种设计模式的一种&#xff0c;它将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 当我们需要实列化一个复杂的类&#xff0c;以得到不同结…

图文并茂 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。容器有效地将由单个操作系统管理的资源划分到孤立的组中&#…

获取Linux内存、cpu、磁盘IO等信息

#!/bin/bash # 获取要监控的本地服务器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} echo "IP地址&#xff1a;"$IP# 获取cpu总核数 cpu_numgrep -c "model name" /proc/cpuinfo echo "cpu总核数&#xff1a;"$c…

Docker容器网络解析

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

将指定excel的一列数据提取到另一个excel的指定列

#!/usr/bin/env python import openpyxl bjD:/地市县公司/西藏台账数据分析-设备台帐分析.xlsx wb openpyxl.load_workbook (bj) get_sheets wb.sheetnames #print(get_sheets) TA01TA01 TA02TA02 TA03TA03 TE01TE01 YG201YG201 YG202YG202 YG203YG203 YG204YG204 YG205YG205…