打怪升级之小白的大数据之旅(五十六)<Zookeeper内部原理>
Posted GaryLea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打怪升级之小白的大数据之旅(五十六)<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票
- 第一台服务器server1启动了,它发现整个集群就它一个人,于是投了自己一票,满心欢喜,自己能当老大了;事实是集群数为1/5,不够半数,无法当选
-
第二轮选举
- 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站上的技术视频质量是真的高~~
以上是关于打怪升级之小白的大数据之旅(五十六)<Zookeeper内部原理>的主要内容,如果未能解决你的问题,请参考以下文章
打怪升级之小白的大数据之旅(五十)<MapReduce框架原理二:shuffle>
打怪升级之小白的大数据之旅(五十九)<Hadoop优化方案>
打怪升级之小白的大数据之旅(五十四)<Zookeeper概述与部署>