点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。

文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。

说说zk的选举机制

基础概念
  • zxid=事务id=一个时间戳,代表当前事件发生的先后顺序,zxid越小代表事件发生的时间越早;zxid由64位数字组成=高32位的epoch+低32位递增数列,每个leader都有自己的统治年代,高32位epoch代表当前leader的统治年,低32位则是递增计数位,所以在同一个集群中每个节点的zxid都都可能不同,因为高32位epoch相同但低32位递增数列不同;

    myid=zk集群中每个节点的标识id;
  • zk的leader选举分为集群启动阶段和运行阶段的选举
  • 选举原则:比较每个节点的(zxid,myid),在当选节点的票数>总节点数/2(该原则可以避免zk集群的脑裂问题),zxid大者当选,若zxid相同再比较myid,myid大者当选;若当前已发生投票节点数未过半,则继续等待投票
  • zk保证CAP中的CP,不保证可用性(A):因为在zk集群选举过程中不对外提供服务
  • zk可以保证数据不丢失:因为在选举过程中zxid较大的节点会当选leader,zxid越大代表数据越新(但这种保证是不严格的:启动阶段zxid相同,但运行阶段zxid相对较大的位于中间的节点会当选,zxid最大但位于最后的节点反而不当选)
  • 选举需满足【当选节点的票数>总节点数/2】,故这种情况选举不出leader:整个集群中过半的节点挂掉了,此时永远不满足【当选节点的票数>总节点数/2】
  • 集群总节点数一般设为基数【2N+1】,目的有两个:
    • 出于成本考虑。当集群有5个节点时,最多挂掉2个节点,此时剩下3台,最大的当选节点票数为3>总节点数/2=5/2=2.5;当集群有6个节点,最多挂掉2个节点,此时剩下4台,最大当选票数为4>总节点数/2=6/2=3。所以5个节点和6个节点服务器的容错数都是一样的,但明显5台服务器成本更少。
    • 防止脑裂。脑裂=一个集群由于网络故障分为两个集群,这两个集群又各自选选举出了自己的主节点,这样就有两个主节点了,原本只有一个主节点现在有了两个,类似于大脑裂开了两半;当考虑过半机制时,不管节点裂开成多少个集群,每个集群都需要超过总节点数的一半才能选主成功,这样自始至终都只有一个裂开后形成的集群能正常选主,其他裂开后形成的集群不能选主而不能正常工作
启动阶段的leader选举

zk集群至少要有3个节点,假如有5个节点1、2、3、4、5先后启动,它们启动时的zxid都是一样的(设为0):

->节点1进入looking选举状态,给自己投票,发出(0,1),此时当选节点票数=1<节点总数的一半=2.5,故节点1仍保持looking状态继续等待选举

->节点2进入looking选举状态,给自己投票,发出(0,2),myid为2最大,2当选,但此时当选节点票数=2<节点总数的一半=2.5,故节点2仍保持looking状态继续等待选举

->节点3进入looking选举状态,给自己投票,发出(0,3),myid为3最大,3当选,且此时当选节点票数=3>节点总数的一半=2.5,故节点3当选leader

->节点4进入looking选举状态,给自己投票,发出(0,4),但此时集群leader已选出,所以节点4仍成为follwer

->节点5进入looking选举状态,给自己投票,发出(0,5),但此时集群leader已选出,所以节点5仍成为follwer

->选举完成后,leader的状态由looking变为leading,follower的状态由looking变为following

总的来说,启动阶段的选举当选的必然为位于中间的节点

运行阶段的选举

运行阶段每个节点的zxid都可能不同,但选举原则与启动阶段一样,都是先比较zxid,再比较myid,假如主节点3运行中挂掉了,其他所有从节点全部进入looking状态,节点1、2、4、5的zxid为121、122、124、125,且各从节点都推举自己为下一个leader,节点1发出(121,1),节点2发出(122,2),节点4发出(124,4),由于节点4的zxid比1、2的大,故4当选,且当选节点票数=3>总节点数/2=5/2=2.5,所以4当选新一代leader,节点5发出(125,5),但此时已经选举出leader,所以5成为follwer,最后leader变更状态为leading,follower变更为following

OK,如果文章哪里有错误或不足,欢迎各位留言。

创作不易,各位的「三连」是二少创作的最大动力!我们下期见!

zookeeper篇-zk的选举机制的更多相关文章

  1. ZooKeeper 的读写操作 & 选举机制

    0. 说明 记录 ZooKeeper 的读写操作和选举机制 1. ZooKeeper 的读写操作 读操作:所有 ZooKeeper 节点都可以提供读请求(包括 follower 和 leader ) ...

  2. 8.8.ZooKeeper 原理和选举机制

    1.ZooKeeper原理 Zookeeper虽然在配置文件中并没有指定master和slave但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通 ...

  3. zookeeper选举机制

    在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...

  4. Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!

    前言 zookeeper相信大家都不陌生,很多分布式中间件都利用zk来提供分布式一致性协调的特性.dubbo官方推荐使用zk作为注册中心,zk也是hadoop和Hbase的重要组件.其他知名的开源中间 ...

  5. 理解zookeeper选举机制

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. 学习笔记:Zookeeper选举机制

    1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...

  7. Zookeeper的概述、安装部署及选举机制

    一.Zookeeper概述 1.Zookeeper是Hadoop生态的管理者,它致力于开发和维护开源服务器,实现高度可靠的分布式协调. 2.Zookeeper的两大功能: (1)存储数据 (2)监听 ...

  8. zookeeper leader选举机制

    最近看了下zookeeper的源码,先整理下leader选举机制 先看几个关键数据结构和函数 服务可能处于的状态,从名字应该很好理解 public enum ServerState { LOOKING ...

  9. 关于Zookeeper选举机制

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

随机推荐

  1. jinja2.exceptions.TemplateNotFound 报错处理

    一.检查模板文件夹是否正确. 遇到这个问题,首先需要检查你的模板文件夹命名是否规范,Flask默认会在工程下寻找templates文件夹,这个是默认配置,不能写成template或者其他名字.当然,如 ...

  2. spring学习二:jdbc相关回顾以及spring下dao

    目录: Part一:回顾java web部分的jdbc.事务.连接池和dbutils工具等 : Part二:spring的JdbcTemplate使用: Part三:spring的事务处理: Part ...

  3. kafka 如何不消费重复数据?比如扣款,我们不能重复的扣?

    其实还是得结合业务来思考,我这里给几个思路: 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入 了,update 一下好吧. 比如你是写 Redis,那没问题了,反正每次都是 s ...

  4. spring 自动装配 bean 有哪些方式?

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...

  5. yum下载安装mysql服务

    1.下载mysql源码 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2.安装mysql源 yum ...

  6. Python - 本地文件读写(初级)

  7. git 泄露(Log、Stash、Index)svn泄露

    Git泄露 Log 首先介绍下.git:Git泄露:当前大量开发人员使用git进行版本控制,对站点自动部署.如果配置不当,可能会将.git文件夹直接部署到线上环境.这就引起了git泄露漏洞. 首先使用 ...

  8. zx-editor 移动端(HTML5)富文本编辑器,可与原生App混合(hybrid)开发

    ZxEditor 移动端HTML文档(富文本)编辑器,支持图文混排.引用.大标题.无序列表,字体颜色.加粗.斜体. 可用于独立web项目开发,也可以用于与原生App混合(hybrid)开发. 源码地址 ...

  9. 防止自己的页面不被其他网站的页面的iframe引用

    方法用二: 一.设置http请求头的X-Frame-Options: X-Frame-Options可以设置三个值 1.DENY  代表页面不会能被嵌入到iframe或者frame里 2.SAMEOR ...

  10. java多线程的状态转换以及基本操作

    1. 新建线程 一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了:(1)分发处理发送给给JVM信号的线程 ...