理解zookeeper选举机制

2023-11-09

一、zookeeper集群

配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。

这篇主要分析leader的选择机制,zookeeper提供了三种方式:

  • LeaderElection  
  • AuthFastLeaderElection
  • FastLeaderElection (最新默认)

默认的算法是FastLeaderElection,所以这篇主要分析它的选举机制。

二、选举流程简述

目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:

  • 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
  • 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
  • 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
  • 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
  • 服务器5启动,后面的逻辑同服务器4成为小弟。

三、选择机制中的概念

1、Serverid:服务器ID

比如有三台服务器,编号分别是1,2,3。

编号越大在选择算法中的权重越大。

2、Zxid:数据ID

服务器中存放的最大数据ID.

值越大说明数据越新,在选举算法中数据越新权重越大。

3、Epoch:逻辑时钟

或者叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。

4、Server状态:选举状态

  • LOOKING,竞选状态。
  • FOLLOWING,随从状态,同步leader状态,参与投票。
  • OBSERVING,观察状态,同步leader状态,不参与投票。
  • LEADING,领导者状态。

四、选举消息内容

在投票完成后,需要将投票信息发送给集群中的所有服务器,它包含如下内容。

  • 服务器ID
  • 数据ID
  • 逻辑时钟
  • 选举状态

五、选举流程图

因为每个服务器都是独立的,在启动时均从初始状态开始参与选举,下面是简易流程图。

六、选举状态图

描述Leader选择过程中的状态变化,这是假设全部实例中均没有数据,假设服务器启动顺序分别为:A,B,C。

七、判断是否已经胜出

默认是采用投票数大于半数则胜出的逻辑。

八、选举流程详述

一、首先开始选举阶段,每个Server读取自身的zxid。

二、发送投票信息

   a、首先,每个Server第一轮都会投票给自己。

   b、投票信息包含 :所选举leader的Serverid,Zxid,Epoch。Epoch会随着选举轮数的增加而递增。

三、接收投票信息

  1、如果服务器B接收到服务器A的数据(服务器A处于选举状态(LOOKING 状态)

     1)首先,判断逻辑时钟值:

    a)如果发送过来的逻辑时钟Epoch大于目前的逻辑时钟。首先,更新本逻辑时钟Epoch,同时清空本轮逻辑时钟收集到的来自其他server的选举数据。然后,判断是否需要更新当前自己的选举leader Serverid。判断规则rules judging:保存的zxid最大值和leader Serverid来进行判断的。先看数据zxid,数据zxid大者胜出;其次再判断leader Serverid,leader Serverid大者胜出;然后再将自身最新的选举结果(也就是上面提到的三种数据(leader Serverid,Zxid,Epoch)广播给其他server)

    b)如果发送过来的逻辑时钟Epoch小于目前的逻辑时钟。说明对方server在一个相对较早的Epoch中,这里只需要将本机的三种数据(leader Serverid,Zxid,Epoch)发送过去就行。

    c)如果发送过来的逻辑时钟Epoch等于目前的逻辑时钟。再根据上述判断规则rules judging来选举leader ,然后再将自身最新的选举结果(也就是上面提到的三种数据(leader  Serverid,Zxid,Epoch)广播给其他server)。

    2)其次,判断服务器是不是已经收集到了所有服务器的选举状态:若是,根据选举结果设置自己的角色(FOLLOWING还是LEADER),退出选举过程就是了。

最后,若没有收到没有收集到所有服务器的选举状态:也可以判断一下根据以上过程之后最新的选举leader是不是得到了超过半数以上服务器的支持,如果是,那么尝试在200ms内接收一下数据,如果没有新的数据到来,说明大家都已经默认了这个结果,同样也设置角色退出选举过程。

  2、 如果所接收服务器A处在其它状态(FOLLOWING或者LEADING)。

    a)逻辑时钟Epoch等于目前的逻辑时钟,将该数据保存到recvset。此时Server已经处于LEADING状态,说明此时这个server已经投票选出结果。若此时这个接收服务器宣称自己是leader, 那么将判断是不是有半数以上的服务器选举它,如果是则设置选举状态退出选举过程。
    b) 否则这是一条与当前逻辑时钟不符合的消息,那么说明在另一个选举过程中已经有了选举结果,于是将该选举结果加入到outofelection集合中,再根据outofelection来判断是否可以结束选举,如果可以也是保存逻辑时钟,设置选举状态,退出选举过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解zookeeper选举机制 的相关文章

  • Linux学习笔记——ZooKeeper集群安装部署

    5 8 ZooKeeper集群安装部署 5 8 1 简介 Zookeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Hadoop和HBase的重要组件 它是一个为分布式应用提供一致性服务的软件 提供的功能包括 配置维护 域名服务
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • Kafka

    1 概述 1 1 定义 Kafka是一个分布式的基于发布 订阅模式的消息队列 主要应用于大数据实时处理领域 优势 kafka可以做到 使用非常普通的硬件 也可以支持每秒数百万的消息读写 MQ 代表消息队列 kafka只是众多mq中一款产品
  • zookeeper入门到精通03——zookeeper集群搭建

    zookeeper集群搭建 3 1 多虚拟机环境搭建 3 2 zookeeper集群搭建 3 1 多虚拟机环境搭建 我们需要搭建zookeeper集群 而由于zookeeper的的服务器数量需要设置为单数 前文介绍了原因 一个zookeep
  • python-kafka多线程快速读取consumer消费者数据,同时使用批读取与无限流读取改进

    python单线程循环读取consumer会很浪费时间 而且速率远远低于生产者可容纳的速率 因此我们使用多线程来处理IO密集型的读取操作 文章目录 极简的示例 1 生产者 先运行 2 消费者部分多线程读取 消费者改进 1 批次读取 并将读取
  • zookeerp安装与配置

    1 zookeeper官网 https zookeeper apache org 2 找到download 然后打开的页面打开archive 版本页面不选择内测或者公测版本 选择一个稳定的 然后下载下来 解压 进入红框目录 在红框目录打cm
  • linux上zookeeper单机搭建伪集群

    Zookeeper 一 下载zookeeper 解压到指定文件夹下 tar zxvf apache zookeeper 3 5 8 bin tar gz C home zk 改个名字 这个随意 mv apache zookeeper 3 5
  • 微服务全栈:深入核心组件与开发技巧

    文章目录 1 服务注册与发现 1 1 客户端注册 ZooKeeper 1 2 第三方注册 独立的服务Registrar 1 3 客户端发现 1 4 服务端发现 1 5 Consul 1 6 Eureka 1 7 SmartStack 1 8
  • Kafka常见的导致重复消费原因和解决方案

    点击上方蓝色字体 选择 设为星标 回复 资源 获取更多资源 大数据技术与架构 点击右侧关注 大数据开发领域最强公众号 暴走大数据 点击右侧关注 暴走大数据 问题分析 导致kafka的重复消费问题原因在于 已经消费了数据 但是offset没来
  • CAP和BASE

    CAP概念 Consistency 一致性 所有节点在同一时间具有相同的数据 Availability 可用性 保证每个请求不管成功或者失败都有响应 Partition Tolerance 分区容错性 系统中任意信息的丢失或失败不会影响系统
  • zookeeper基本架构

    要全面了解zookeeper 首先我们得知道什么是zookeeper 能做什么 zookeeper是一个开源的分布式协调服务 主要用于数据订阅 发布 集群管理 配置管理 分布式锁 基本架构 zookeeper基本架构如下 zookeeper
  • INFO zookeeper.ClientCnxn: Opening socket connection to server***/192.168.80.151:2181. Will not

    at org apache zookeeper ClientCnxnSocketNIO doTransport ClientCnxnSocketNIO java 361 at org apache zookeeper ClientCnxn
  • ZooKeeper面试题(2020最新版,狂神说docker进阶笔记

    这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知 9 客户端回调 Watcher 客户端 SendThread 线程接收事件通知 交由 EventThread 线程回调 Watch
  • 年底裸辞准备面试,我用7张图画了ZK分布式锁!

    一 写在前面 之前写过一篇文章 都2022年了 出去面试连分布式锁的源码你都不会画 给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的 这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理 同理 我是直接基于
  • 搭建zookeeper集群的时候报: JAVA_HOME is not set and java could not be found in PATH.错误

    我在搭建zookeeper集群的时候总是报 JAVA HOME is not set and java could not be found in PATH 的错误 但是我的java环境是没问题的 这个问题困扰我两天了 终于解决了 在此记录
  • Zookeeper之ZAB协议

    1 概念 Zookeeper使用 种称为Zookeeper Atomic Broadcast ZAB Zookeeper原 消息 播协议 的协议作为其数据 致性的核 算法 ZAB协议并不像Paxos算法那样 是 种通 的分布式 致性算法 它
  • kafka配置内外网访问

    listeners 学名叫监听器 其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务 advertised listeners 和 listeners 相比多了个 advertised Advertised 的
  • zookeeper学习草稿纸

    指令重排序 https baijiahao baidu com s id 1701616903992143186 wfr spider for pc JVM JDK JRE 静态方法为什么不能调用非静态成员 重载和重写的区别 可变参数 基本
  • Spring-boot+Dubbo(直连模式)

    Spring boot Dubbo 直连模式 Demo 这里应该有很多人会问 直连模式 什么鬼啊 一般情况下我们进行微服务开发时 都是通过zookeeper等注册中心来实现服务的提供和引用的 那直连模式没啥用啊 其实不然 直连模式大有用处
  • 大数据技术之Zookeeper

    大数据技术之Zookeeper 一 zookeeper特点 二 zookeeper单机模式 三 zookeeper 常用命令 四 查看zookeeper 状态的几种方式 一 zookeeper特点 Zookeeper 文件系统 通知机制 1

随机推荐

  • v8学习---添加js全局函数

    v8学习 添加js全局函数 标签 v8 2013 11 10 10 11 951人阅读 评论 0 收藏 举报 分类 v8 12 版权声明 本文为博主原创文章 未经博主允许不得转载 cpp view plain copy include
  • URL 链接中 井号#、问号?、连接符& 分别有什么作用?

    井号 表示网页中的一个位置 被称之为锚点 常用于某个网页间不同位置的跳转 简单的说就是在一个网页中 URL 不变的情况下 通过添加 buy 的字符在 URL 最后可以跳转到当前网页中已经定义好的锚点 id buy 位置 同样 的改变也会增加
  • APPIcon生成

    有两种生成方法 比较常用 一种是设计师常用的 在线生成图标 https icon wuruihong com 支持 jpg png psd 文件 可以生成圆角 可以自定义大小 生成后可以预览 模拟手机屏幕的效果预览 第二种就是终端生成 利用
  • PyTorch&CUDA安装过程及测试

    PyTorch CUDA安装过程及测试 1 准备工作 1 1 Anaconda NVDIA驱动 之前安装过了Anaconda和NVIDIA驱动 所以直接跳过这几步 打开NVIDIA控制面板 帮助 gt 系统信息 gt 组件 查看自己的CUD
  • 亲!了解一下开源许可协议呗?

    哈喽 大家好 我是指北君 今天我来给大家简单讲讲开源许可协议 只有了解开源许可协议 才能合法合理地使用各种开源软件 并保护自己的合法权益 一 开源许可协议的目标 开源许可协议 也称 许可证 它是一些开源支持组织为了激励和保护开源软件开发者的
  • cortex M3/M4内核 特权级与用户级详解

    一 程序运行为什么要有用户级与特权级区分 用户级和特权级的实现是为了给存储器提供一种保护机制 让用户代码不能访问特定的存储区域 只有特权级级代码才能有权限访问特定的存储区域 防止用户代码或者应用代码意外或恶意访问操作系统的数据存储区域 一般
  • MySQL(17)MySQL数据类型:日期和时间类型

    日期和时间类型 MySQL 中有多处表示日期的数据类型 YEAR TIME DATE DTAETIME TIMESTAMP 当只记录年信息的时候 可以只使用 YEAR 类型 每一个类型都有合法的取值范围 当指定确定不合法的值时 系统将 零
  • discuz密码找回:忘记UCENTER创始人密码

    1 通过ftp工具连接您的虚拟主机在网站根目录uc目录下的子目录 data中找到文件config inc php 注意 不是跟目录data 是uc server data 2 通过代码编辑器打开它 找到类似以下代码 define UC FO
  • win下处理器组概念

    微软官方文档 https docs microsoft com en us windows win32 procthread processor groups 译文如下 64位版本的Windows 7和Windows Server 2008
  • 字符串拆分--spilt()

    待补充
  • python3关于标识符global的理解

    我有个需求是在两个类 在同一个 py模块中 之间 设定一个全局变量供这个两个类来访问 我就打算使用global来实现 但我对于global的用法不是很熟 在查找相关资料后实现了自己的需求 所以特此记录下自己对于python3中global的
  • 【转】一文了解Socket

    原文链接 https segmentfault com a 1190000013712747 什么是Socket Socket的中文翻译过来就是 套接字 套接字是什么 我们先来看看它的英文含义 插座 Socket就像一个电话插座 负责连通两
  • unity:导航系统实例

    在很多游戏中经常会有这样一种功能 鼠标右键点一下地图上的某个地方 角色就会自动前往所点击的地方 或者是点击一下任务就会开启自动寻路 这种功能其实就是导航系统或者叫寻路系统 可以实现自动寻找最近花费代价最低的路径并且会自动躲避障碍物等功能 u
  • 将int类型的数和QString类型的数之间的转换

    参考博客 https blog csdn net yl best article details 80105872 代码中实现的功能为 int a 200 QString text QString number a 10 ui gt lab
  • Devops学习实践(一) SVN安装和配置

    随着工作的要求 devops作为今年工作的一个重点 由此也引发了自己对于devops相关的工具和技术的学习和实践 基于上述背景 这个系列将逐步的介绍SVN的安装和配置 jenkins安装和配置 reviewboard findbugs ch
  • Navicat每次连接MySQL都会产生id_cache.db,id_cache.db-wal,id_cache.db-shm的三个文件

    这三个是Navicat连接数据库时产生的如果没有设置存储位置会直接存储在你的根目录下 看着很难受 Navicat中可以设置其存储位置 选中连接 gt 编辑连接 gt 高级 gt 设置位置
  • 安卓高德地图API根据城市名获取对应的经纬度和地理编码

    private void getLatlon String cityName GeocodeSearch geocodeSearch new GeocodeSearch context geocodeSearch setOnGeocodeS
  • 小程序生成二维码图片保存相册并分享到朋友圈

    小程序echarts canvasdrawer实现页面转化图片并保存到相册 场景 小程序测试活动 实现echarts雷达图展示不同的结果 微信头像 二维码 测试结果文字 最终绘制出一张图片用户保存相册 考虑到开发时间及各种坑使用了canva
  • 12.rtl8188驱动移植

    文章目录 问题 我的解决办法 测试验证 问题 最开始用的rtl8188驱动支持的linux内核版本太低了 编译会出现一些错误 这些错误我尝试去解决 但是并没有成功 上网查找了大量的资料最后才知道是内核版本的问题 我的内核版本是4 19 比较
  • 理解zookeeper选举机制

    一 zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的 每个服务器上的数据是相同的 每一个服务器均可以对外提供读和写的服务 这点和redis是相同的 即对客户端来讲每个服务器都是平等的 这篇主要分析lead