打怪升级之小白的大数据之旅(五十六)<Zookeeper内部原理>

打怪升级之小白的大数据之旅(五十六)

Zookeeper内部原理

上次回顾

上一章介绍了操作zookeeper的两种方式,shell和代码,然后通过一个实例动态上下线来体验zookeeper的魅力,本章节是对zookeeper的内部原理进行分享,zookeeper的内部原理比较重要的就是监听器原理和选举机制,让我们开始吧~~

zookeeper内部原理

节点类型

  • 在上一章的动态上下线案例我们用过临时节点,这下来详细说明一下zookeeper的节点
  • zookeeper的节点分成两大类,一类是持久化节点和临时节点,一类是有序号节点和无序号节点,它们通常两两组合来创建出一个节点
  • 默认是持久的无序号节点
    在这里插入图片描述
  • 如果要创建序号和临时节点,就需要添加参数,这个我们上一章说过了具体的创建方法
  • 序号节点类似mysql的主键自增,它会为我们的节点后面添加上自增的序号
  • 临时节点创建后,如果创建节点的服务器断开连接,在zookeeper上就会自动销毁该节点

Stat结构体

在上一章介绍zookeeper命令的时候,我们查看节点状态会输出下面的内容
在这里插入图片描述
下面我来介绍一下,节点状态的内容都有什么:

  • czxid-创建节点的事务zxid
    • 每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
    • 事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
  • ctime - znode被创建的毫秒数(从1970年开始)
  • mzxid - znode最后更新的事务zxid
  • mtime - znode最后修改的毫秒数(从1970年开始)
  • pZxid-znode最后更新的子节点zxid
  • cversion - znode子节点变化号,znode子节点修改次数
  • dataversion - znode数据变化号
  • aclVersion - znode访问控制列表的变化号
  • ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
  • dataLength- znode的数据长度
  • numChildren - znode子节点数量

我们重点要了解,事务的zxid,它的主要作用就是用来做数据的同步,通过它,我们就可以对数据进行同步,它也是一个节点是否在选举机制中当leader的条件之一

监听器原理

在这里插入图片描述
我们的动态上下线实现的逻辑就是监听器原理,下面我来介绍一下zookeeper的监听器原理,了解完监听器原理,我们再回看一下上一章的动态上下线案例,就会更加清晰地了解监听器原理的工作流程

  • 首先,监听器原理分为两部分,一个是zookeeper集群,一个是我们操作zookeeper的客户端
  • zookeeper的集群内部有一个注册的监听器列表,它的作用就是当节点发生变化时,通知监听器列表中注册的客户端们
  • 客户端有一个Main主线程,它内部有连个子线程linster和connect,connect的工作就是将客户端添加到zookeeper的注册监听器列表中
  • 当节点发生变化时,zookeeper就会将节点变化情况通知给注册监听器列表中的客户端们
  • 客户端通过linstener接收到变化情况后,就会通过proess方法告知客户端节点的变化情况

常见的监听有两种

  • 监听节点数据的变化
    get path[watch]
  • 监听子节点增减的变化
    ls path[watch]

选举机制

  • zookeeper的选举机制是它的一个重点,我们知道,zookeeper的集群有一个老大leader和众多的小弟 follow组成,那么leader是怎么选举的呢?
    在这里插入图片描述

选举前的准备工作

参选的人员

  • 我们假设zookeeper集群中有五台服务器server1|server2|server3|server4|server5

参选的依据

  • zxid
    • zixd我们可以理解为数据的最新版本
  • myid
    • 服务器的编号,这个值是我们在zookeeper集群部署时设置的,我们可以将它理解为个人的实力强弱
    • server1|server2|server3|server4|server5的编号我们就假设它是1,2,3,4,5

参选的规则

  • 半数机制
    • 选举leader老大是通过民主的选举,达到半数以上即可当leader

开始竞选老大

在这里插入图片描述

全新的zookeeper集群进行选举

因为全新的zookeeper集群没有数据,所以还没有zxid,选举时,就直接通过myid进行投票
zookeeper集群是逐一来启动服务器的

  • 第一轮选举

    • 第一台服务器server1启动了,它发现整个集群就它一个人,于是投了自己一票,满心欢喜,自己能当老大了;事实是集群数为1/5,不够半数,无法当选
      server1    1
  • 第二轮选举

    • server2启动了,它也为自己投了一票,然后发现集群里已经有server1了,于是它向server挥舞出自己的myid
    • server1看了看自己的myid,哎,自己的编号是1,server2的编号是2,完胜,叹了一口气,将自己的那一票投给了server2
    • 此时集群数为2/5,依旧不够半数,无法当选
      server1 0票
      server2	2
  • 第三轮选举

    • server3启动了,它也为自己投了一票,然后拿着自己的myid来展示自己的实力,server1和server2为之臣服,好了,将自己的票都投给了server3
    • 此时集群数为3/5,超过了半数,成功当选leader老大
      server1	0票
      server2	0票
      server3	3
  • 第四轮选举

    • server4启动了,它为自己投了一票,然后拿着自己的myid来展示实力,没人理他,因为server3已经超过半数当上了leader,它只能无奈的当小弟
  • 第五轮选举

    • 它的下场和server4一样,直接当server3的小弟
非全新的zookeeper集群进行选举
  • 这个情况是在leader泵机挂掉了,此时就需要重新选举
  • 在选举的时候,首先看zxid,如果中间只有一台服务器的zxid最新,意味着它持有最新的数据,那么它直接荣升老大
  • 如果zxid相同,则规则如同上面的全新选举

写数据流程

在这里插入图片描述
具体的流程我写到了图里,下面我举个栗子来说明上面写数据的流程

  • 在公司,老板(客户端)到我工位上:你告诉一下你们老大leader,我们有一个新的项目(数据写入),通知一下大家,做好准备
  • 于是我把这个消息告诉了我们的老大leader,leader于是通知所有项目组的人(follower)开会
  • 老大部署好任务后,总会说一句: 大家都清楚了吗?我们需要附和:清楚了/收到!
  • 然后我们根据老大的安排进行开发(数据写入)

总结

好了,zookeeper我们基本上就全部学完了,当然了,我们只是学我们会用到的知识点,zookeeper还有很多的东西,用好zookeeper可以大大加快我们集群的效率,具体的大家可以去B站上看看相关的视频讲解,墙裂推荐B站,B站上的技术视频质量是真的高~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值