一文带你透析zookeeper原理

1 篇文章 0 订阅
订阅专栏

一:Zookeeper集群组成

在这里插入图片描述

1.1 Leader领导者

zookeeper是基于读写分离设计的,leader既可以进行读操作,也可以进行写操作,而其它的follower和Observer只能处理client的读操作。

一个Zookeeper集群中有且只能有一个leader,而且必须有leader。zookeeper数据一致性采用的是最终一致性,所以一旦leader发生了单点故障,为了避免client从zk集群中取出错误的数据,整个服务器会进行不可用状态。所以如何在原先的leader挂掉之后快速选举一个新的leader是zk集群可靠性的关键,这点之后会讲。

1.2 Follower跟随者

Follower是作为leader的从属出现的,由于zk的最终一致性,follower最终会具备全量数据即zk特性中的统一视图,完全可以来降低leader的读压力,解决client的读操作。当leader挂掉之后,集群会进行选主工作,会从follower中选举出一个新的leader,从中可以看成follower还具备发起选举leader,以及投票权。

1.3 Observer观察者

observer的功能比follower更加单一,它不具备像follower选举新的leader的权利,它仅仅只有接收client读操作的权力。

如何配置Observer:
大家可以去zookeeper中文网上看教程: zookeeper中文网


二:zookeeper的数据结构–目录树

zookeeper和redis一样也可以储存数据,redis是以kv结构和五大基础数据类型来储存数据的,那zookeeper是如何来储存数据的呢?
在这里插入图片描述图片摘自zookeeper中文网
zk储存数据类似于kv结构,key是路径path,value是data
zk是以节点为单位来储存数据的,但是zk是作为分布式协调服务出现的,虽然zk能够储存数据且数据可靠,但是一定不要将zk当作数据库用,zk在以读为主的系统中效率最高,如果频繁的写数据,或者写占用内存大的数据会降低zk的性能,zk更多的是储存ip,config配置中心,以及一些简单的数据,也可以做分布式锁,但一定不要把它当数据库用。
zk中node最多储存1M的数据。

2.1 Node节点的分类

在这里插入图片描述

持久节点:永久储存的节点

临时节点:zk和redis等中间件不一样,zk是没有连接池这种概念的,客户端通过session与zk server进行连接,我们可以选择将节点保存在session中,但保存在session中的节点会随着client断开或者session有效期过期而丢失。

2.2 并发写同名path覆盖问题-序列节点

我们可以通过create path date 向指定目录下创建一个节点,但如果是并发环境下,多个客户端向zookeeper同一个目录下设置相同名称的节点就会产生覆盖问题,后面执行的会把前面执行的覆盖掉。如果我们不想覆盖的话,只需要为每一个名称后面拼接一个唯一标识的后缀即可。
在zookeeper中可以通过 create -s path data 来创建一个名称序列化节点

在这里插入图片描述
注意:实际存入的是序列化后的节点,所以get的时候要用序列化后的文件目录路径。
在这里插入图片描述

注意这个拼接的后缀id是递增且不会回退的,也就是说我们可以利用这种机制来设置按照时间先后对这个同名的key进行排序,这个会在zk实现分布式锁的时候用到,后面会讲。

2.3 server宕机导致session切换问题

如果客户端连接zookeeper集群其中任意一台server,并向session中写入临时节点数据,这时,如果这台server发生宕机,那么在zookeeper集群任然可用的前提下,会自动切换到另一台server,并且储存在server中的数据并不会发生数据丢失,会与新的server建立一个同sessionid的session并保留之前的数据。

一开始连接 155机
在这里插入图片描述
手动关闭155server后切换到154服务器
在这里插入图片描述
发现其session id没有发生变化,在故障转移时,session也会跟着转移并保留内部数据。

2.4 总结

目录树的结构可以帮我们完成很多功能

  1. 小于等于1M的数据统一配置管理
  2. 按不同的path目录来完成节点的分类管理
  3. sequential序列化可以完成统一命名管理
  4. 可以利用临时节点来完成分布式锁

三: zookeeper的选主机制

前置知识:在学习zk选主之前我们先来了解一下zk自增永不回退的事务id--Zxid

3.1 zk的事务id–Zxid

Zxid是一个64位的数字,其高32位代表者当前leader的版本(每更换一个leader其版本+1),其低32位代表当前当前zk写操作的版本,每一次写操作都为导致其低32位+1。
具体细节可参考这篇博客: Zookeeper的zxid

前置知识:zk的重要端口

3.2 zk集群的2888和3888端口

我们先看一看zk的配置文件 zoo.cfg
在这里插入图片描述
我们可以观察到在每一个zk server都配置了2888和3888两个端口,那么这两个端口具体有什么含义呢?
在zookeeper集群中所有节点都会开启3888端口,3888端口用来leader发生故障时,投票选举出新的leader。
所有节点都会与其它节点的3888端口建立TCP连接

但只有leader才会开启2888端口,其它节点都会与leader2888端口建立TCP连接, 其主要功能是接收其它follwoer和observer节点发送过来的写事务并执行。

通过上述条件我们可以知道任何两台follower之间均可通过3888端口进行通信。这是在leader挂了之后能够快速选主的基础条件。

3.3 zk集群选主的规则

每一个zk server都会有自己的Zxid与myid,而具体要选哪个follower称为leader呢?毫无疑问,选最有经验最老道的(即保存数据最全,Zxid最大),如果Zxid相同都拥有原先leader的全量数据,那就选myid最大的。

  1. 先按Zxid比较
  2. Zxid相同则按myid比较
  3. 只有一个follower获得过半的支持票,它才能称为新的leader

zk集群选主规则简单吧?但实际上确有一系列的问题。接下来我们通过一个例子,带大家深入了解zk的选主规则。

3.4 zk集群选主案例

本案例是四台server组建的zk集群,其中leader挂了之后,另三台follower集群选主的过程。
在这里插入图片描述
首先我们要考虑一件事情,我们要进行集群选主,那么必定要到集群属于无主状态才能选主,那么follower怎么知道它的leader有没有挂?对了,可以通过定时心跳去看看主有没有挂,或者follower主动去向zk同步数据/发送写事务时发现连接不上leader,从而得知leader挂了。而这种机制是具有延时性的比如某个follower刚和leader心跳完leader就挂了,那么它可能会到下一次心跳时才会发觉leader挂了,这种延时性是难以接收的。

那么如何去解决leader挂了之后可能只有部分follower意识到的情况下,要让所有网络通信正常的follower全部参加集群选主的过程中。

最差的情况:举例即便在最差的情况下zk选举机制也能让所有通信正常的server参加选举。如上图假设只有node3节点发现leader挂了,那么node3说我要当leader便把自己相当leader的消息与Zxid,myid两个参数一并广播给其它所有的follower节点,node3自己肯定会投自己一票,其它节点根据Zxid和myid两个参数进行比较,如果发现其中节点node1比你牛逼,那么node3你当啥leader,你应该给我投票于是将该消息传回node3,node3修改选票投给node1,node1发现自己干过node3于是也想当ledaer也像node3当初一样广播给其它所有节点;如果node1发现自己干不过node3老老实实给node3投票。

通过上面的选举机制,只要有任何一个follower发现leader挂了,广播自己当leader的消息,一定会触发准ledaer(所有的follower中按Zxid和myid比较最大的节点为准leader)给自己投票并广播出去,由于投票中存在的纠正机制(即原本以为自己牛逼给自己投票广播自己,结果比你更牛逼的节点收到了你要当leader的消息,不服让你去纠正),最终一定会让其它所有节点投给准leader,准leader最终会收到所有的票数。

但实际上任何一个节点只要获得的票数过半,他就会直接成为leader且不需要通知,很迅速。也就是说准leader获得的票数过半就直接宣称自己是真正的新任leader。

3.5 zk集群不可用状态

zk集群进入不可用状态通常有以下两个原因:

  1. zk集群中server的数量不足总量的一半
  2. zk集群的leader挂了
    如果server的数目不足集群总量server的一半,那么连leader都无法选举出来,集群自然进入不可用状态。

四:zk中的数据一致性协议ZAB

4.1 示例

图示:任何一个follower在接收到client的写事务时,会将该写事务交由leader处理,图示leader处理写事务时和follower之间的数据同步。
在这里插入图片描述
想要实现分布式数据一致性就需要先保证zk集群处理write操作时的原子性。

原子性:要么失败要么成功,没有中间状态。如图leader在收到write操作后,广播给其它所有的follower最终必须要有过半的follower保存数据成功,否则事务将被撤销。

ZAB协议为了实现事务操作的有序性,即将一个事务中的指令按顺序放入队列中,最终这个事务将被有序的执行,能保证其有序性。

ZAB协议中的leader广播其它所有follower节点是不需要所有follower收到并给予反馈的,只要过半即可。正因为如此就可能会导致部分follower的Zxid版本偏低,在集群选主时会出现Zxid不同的现象,但实际生产环境中,很少会出现这种Zxid延后的情况,因为ZAB广播后,follower接收不到leader的消息,多半是因为网络通信问题。而如果运维人员连三五台机子的集群都会时常出现连接不上,就可以开了整个运维团队(太菜了)。而由于ZAB实现的是最终一致性,leader会把所有要让follow干的事放进队列中去,最终follower网络通信正常后会从队列中消费到leader让它干的事,最终完成数据一致性。

4.2 为啥leader挂了进入无主状态后要停止服务

讲到这里,不得不思考一个问题,在前面说了zk集群有不可用和可用两种状态,一旦leader挂了进入无主状态就之间停止对外的服务。那为什么集群的其它的follower和observer不能继续提供服务?
首先zookeeper是具有高可用且具有很高可靠性的提供分布式协调服务的框架。一旦leader挂了,就不能保证从follower和observer中取出的数据是正确的。因为zk是最终一致性,可能有部分follower和observer版本延后,其中储存的数据是旧的甚至是错误数据,而此时又不能向leader中要正确的数据,就会导致zookeeper集群连数据一致性都无法保证,自然需要对外停止服务。

**clinet向zookeeper集群取数据时可以主动要求去leader中取真正正确的数据**
client向zk中取数据,zk server从机接收到取数据的请求,在自己的目录树中拿出数据返回给client,并提前声明我这里的数据不一定正确,如果你需要一定正确的数据,请等我一下我去leader同步数据,然后返回给你。也就是说client可以通过sync指令要求zk从机读数据时跟leader同步数据。那么一旦leader挂了,自然就无法确保数据一致性啦!

ZOOKEEPER原理与功能详解
weixin_43461689的博客
08-05 511
ZOOKEEPER原理与功能详解Zookeeper是什么Zookeeper的数据结构ZnodeZnode分类Znode简单操作功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Zookeeper是什么 ZooKeeper 是一个开源
深入分析zookeeper实现原理
03-28
深入分析zookeeper实现原理
Zookeeper的功能以及工作原理
sun
03-17 1187
1.ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 2.ZooKeeper提供了什么? 1)文件系统 2)通知机制 3.Zookee
ZooKeeper原理解析
a805814077的博客
02-07 6003
分布式协调服务组件zookeeper的介绍、特点及原理解析
zookeeper之深入理解其原理
上善若泪
03-14 1169
文章目录1 zookeeper基础1.1 基本了解1.2 角色与功能1.2.1 角色1.2.1.1 三种角色1.2.1.2 为什么引入Observer1.2.2 角色的功能1.3 zookeeper提供了什么1.3.1 文件系统1.3.2 通知机制1.4 Zookeeper的核心及原理1.4.1 zookeeper特性1.4.2 zookeeper原理1.5 zookeeper流程1.5.1 数据...
Zookeeper原理分析
sinat_34814635的博客
02-02 3385
一、基础概念 官方解释: ZooKeeper是面向分布式应用程序的分布式开源协调服务。它公开了一组简单的基元,分布式应用程序可以基于这些基元来实现更高级别的服务,以实现同步,配置维护以及组和命名。它被设计为易于编程,并且使用在文件系统熟悉的目录树结构之后的样式的数据模型。它运行在Java中,并具有Java和C的绑定。协调服务是非常难以正确的。他们特别容易出现诸如竞赛状况和僵局等错误。ZooKe...
Zookeeper 3、Zookeeper工作原理(详细)
weixin_34192816的博客
03-16 2279
1、Zookeeper的角色   » 领导者(leader),负责进行投票的发起和决议,更新系统状态  » 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票  » Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态...
ZooKeeper原理
郝文的博客
03-05 6825
ZooKeeper简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。 ZooKeeper设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。 2.可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。 3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的.
zookeeper基本原理
swpihchj的专栏
04-27 2958
zookeeper介绍 前文介绍了zookeeper的应用场景,本文介绍下zookeeper工作原理zk service网络结构 zookeeper的工作集群可以简单分成两类,一个是Leader,唯一一个,其余的都是follower,如何确定Leader是通过内部选举确定的。 Leader和各个follower是互相通信的,对于zk系统的数据都是保存在内存里面的,同样也会备份一份在
ZooKeeper学习第六期---ZooKeeper机制架构
weixin_33769125的博客
08-29 104
一、ZooKeeper权限管理机制  1.1 权限管理ACL(Access Control List)  ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制。ACL的实现和Unix文件访问许可非常相似:它使用许可位来对一个节点的不同操作进行允许或禁止的权 限控制。但是和标准的Unix许可不同的是,Zookeeper对于用户类别的区分,不止局限于所有者(ow...
Zookeeper原理
02-21
ZooKeeper是一个分布式的,开放源码的分布式应用程序...本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本文讨论的重点。Zookeeper中的角色主要有以下三类,如下表所示:系统模型如图所示:1.最终一致性
一文你吃透 Kafka 这些原理
01-07
如果只是为了开发 Kafka 应用程序,或者只是在生产环境使用 Kafka,那么了解 Kafka 的内部工作原理不是必须的。不过,了解 Kafka 的内部工作原理有助于理解 Kafka 的行为,也利用快速诊断问题。下面我们来探讨一下这...
一文彻底理解ZooKeeper分布式锁的实现原理
01-20
接下来我们一起来看看,多客户端获取及释放zk分布式锁的整个流程及背后的原理。 首先大家看看下面的图,如果现在有两个客户端一起要争抢zk上的一把分布式锁,会是个什么场景? 如果大家对zk还不太了解,建议先百度...
ZooKeeper原理与实战.txt
05-18
ZooKeeper原理与实战 PPT内容
Zookeeper工作原理(详细)
热门推荐
第一次亲密接触
02-15 1万+
1、Zookeeper的角色   » 领导者(leader),负责进行投票的发起和决议,更新系统状态   » 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票   » Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度   » 客户端(client),请求发起方 .
zookeeper原理学习
miracle_8的博客
09-29 350
zookeeper:1、 定义: zookeeper是一个分布式、开源的分布式应用程序协调服务。2、 zookeeper的信息记录方式: 1). zk采用树形结构目录结构记录信息。树的深度没有限制(但实际中,不可能建立很深的树结构),每一个节点称为node2). 每个znode都有一个名称,为了避免出现字符集编码问题,不要使用中文作为znode的名称,另外,同一个znode下的子级znode名称
ZooKeeper原理是什么?
最新发布
学一次的博客
07-19 526
ZooKeeper是一项集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。 ZooKeeper简单,分布式,可靠且快速。
Zookeeper工作原理(详细)(2)
u013915286的博客
04-25 401
1、Zookeeper的角色 领导者(leader),负责进行投票的发起和决议,更新系统状态 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票 Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步 leader的状态,observer的...
Zookeeper 实现原理
数据源的港湾
01-20 765
一直以来只知道Zookeeper是一个分布式协调组件,但究竟其中的原理一直也没深究过,今天看了一点书籍及文章,在此总结一下自己的心得。Zookeeper的概念 Zookeeper是一个分布式的、开源的分布式应用程序协调服务,包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等,它是Google的 Chubby一个开源实现。Zookeeper的特点 1 简单: Zook

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 黑马实战项目瑞吉外卖的总结 21789
  • 【经典算法】N皇后问题 16156
  • 用c语言实现猜数字游戏 14325
  • Spring源码概述 2245
  • 一文带你透析zookeeper原理 2197

分类专栏

  • 分布式ID 1篇
  • 高并发负载均衡 1篇
  • BUG收集 1篇
  • 常用中间件 1篇
  • 小项目 2篇
  • 并发编程 2篇
  • spring源码 1篇
  • JVM 3篇
  • 大厂笔面试算法经典题-基础篇 1篇
  • MySQL 1篇
  • 设计模式 1篇
  • 经典算法题 13篇
  • 力扣题库 2篇
  • Java SE 2篇
  • c语言知识学习 6篇
  • 智力题:编程思维训练 2篇
  • 经典小游戏分享 2篇

最新评论

  • 【c语言进阶】如此清晰的指针讲解让你再也不怕学不会指针了,硬核指针讲解。

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8005796, 请多输出高质量博客, 帮助更多的人

  • 黑马实战项目瑞吉外卖的总结

    来了,来了: 没有放行静态资源,设置一个interceptor支持类。

  • 黑马实战项目瑞吉外卖的总结

    高危型: 新人问一下,登入会跳localhost:63342那个,然后造成登入界面404怎么解决。

  • 黑马实战项目瑞吉外卖的总结

    Mr_张三阿: 有文档资料吗

  • 黑马实战项目瑞吉外卖的总结

    我爱你是真心话: 有没有一种可能,Long型ID不是雪花算法生成的,雪花算法生成的是UUID?这里使用的是ASSIGN_ID?

大家在看

  • CentOS7.9部署安装OpenGauss 5.0.2企业版 191
  • Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践 2301
  • HTML5小游戏【格鲁的实验室--优秀H5小游戏合集】游戏源码分享下载 --- gldsys.zip 60
  • 水果编曲软件 fl studio 21.2.3.4004中文破解版让你的音乐梦想成为现实的软件 566
  • 向量组的秩/求极大线性无关组 602

最新文章

  • 常用的分布式ID解决方案原理解析
  • 高并发负载均衡---LVS
  • Zookeeper遇到的BUG
2023年2篇
2022年18篇
2021年22篇

目录

目录

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源英语起名字网免费取名郑氏女孩起名称灯火阑珊的意思绝密使命电视剧白蛇缘起英文名2字公司起名尼摩船长优惠券平台起名罗姓起名字大全男孩菊豆下载减肥名称起名大全集许氏鼠年起名男孩起名字测名字手机起名软件免费版在线起名免费网站招牌起名字大全集起名大全姓刘男孩鼠韩雪爷爷3月21给店铺免费起名图书馆可以起什么名字雀龙门3起名 宇氵的字有哪些起名字魔兽footman合肥房屋抵押贷款2018狗年小孩子起名婴儿智能起名网陈长生鲁邦三世特别篇淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化