Zookeeper深入原理
Zookeeper 的视图结构是一个树形结构,树上的每个节点称之为数据节点(即 ZNode),每个ZNode 上都可以保存数据,同时还可以挂载子节点。并且Zookeeper的根节点为 "/"。
在 Zookeeper 中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在 Zookeeper 中有如下几类节点:
每个数据节点中除了存储了数据内容之外,还存储了数据节点本身的一些状态信息(State)。
在Zookeeper 中,事务是指能够改变 Zookeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,Zookeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次更新操作,从这些 ZXID 中可以间接地识别出 Zookeeper 处理这些更新操作请求的全局顺序。
ZXID 是一个 64 位的数字,其中低 32 位可以看作是一个简单的单调递增的计数器,针对客户端的每一个事务请求,Leader 服务器在产生一个新的事务 Proposal 的时候,都会对该计数器进行加 1 操作;而高 32 位则代表了 Leader 周期 epoch 的编号,每当选举产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务 Proposal 的 ZXID,并从该 ZXID 中解析出对应的 epoch 值,然后再对其进行加 1 操作,之后就会以此编号作为新的 epoch,并将低 32 位置 0 来开始生成新的 ZXID。
Zookeeper 中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息(在上面的状态信息中已经介绍了三种版本信息代表的意思),对数据节点的任何更新操作都会引起版本号的变化。其中我们以 dataVersion 为例来说明。在一个数据节点被创建完毕之后,节点的dataVersion 值是 0,表示的含义是 ”当前节点自从创建之后,被更新过 0 次“。如果现在对该节点的数据内容进行更新操作,那么随后,dataVersion 的值就会变成 1。即表示的是对数据节点的数据内容的变更次数。
版本的作用是用来实现乐观锁机制中的 “写入校验” 的。例如,当要修改数据节点的数据内容时,带上版本号,如果数据节点的版本号与传入的版本号相等,就进行修改,否则修改失败。
Zookeeper 提供了分布式数据的发布/订阅功能。一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。在 Zookeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。Zookeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
从上图可以看出 Zookeeper 的 Watcher 机制主要包括客户端线程、客户端WatchMananger 和 Zookeeper 服务器三部分。在具体工作流程上,简单地讲,客户端在向 Zookeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchMananger 中。当 Zookeeper 服务器端触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager 中取出对应的 Watcher 对象来执行回调逻辑。
Watcher是一个接口,任何实现了Watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType
注 :客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取;
上面讲到zookeeper客户端连接的状态和zookeeper对znode节点监听的事件类型,下面我们来讲解如何建立zookeeper的watcher监听。在zookeeper中采用zk.getChildren(path, watch)、zk.exists(path, watch)、zk.getData(path, watcher, stat)这样的方式为某个znode注册监听。
下表以node-x节点为例,说明调用的注册方法和可监听事件间的关系:
Zookeeper 中提供了一套完善的 ACL(Access Control List)权限控制机制来保障数据的安全。
ACL 由三部分组成,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme: id:permission”来标识一个有效的ACL 信息。下面分别介绍:
1.7.4、ACL 超级管理员
zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点
假设这个超管是:super:admin,需要先为超管生成密码的密文
那么打开zookeeper目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行:
这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项
那么修改以后这条完整命令变成了
之后启动zookeeper,输入如下命令添加权限
在服务器集群初始化阶段,我们以 3 台机器组成的服务器集群为例,当有一台服务器server1 启动的时候,它是无法进行 Leader 选举的,当第二台机器 server2 也启动时,此时这两台服务器已经能够进行互相通信,每台机器都试图找到一个 Leader,于是便进入了 Leader 选举流程。
在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮leader选举,其过程和启动时期的Leader选举过程基本一致。
假设正在运行的有server1、server2、server3三台服务器,当前leader是server2,若某一时刻leader挂了,此时便开始Leader选举。选举过程如下:
observer角色特点:
为了使用observer角色,在任何想变成observer角色的配置文件中加入如下配置:
并在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:
Eureka和Zookeeper的区别(CAP原理)
1. 著名的CAP理论指出,在分布式系统中,一致性(C)、可用性(A)和分区容错性(P)三者不可能同时得到满足。由于分区容错性是分布式系统必须保证的,因此我们通常需要在A和C之间做出权衡。Zookeeper倾向于保证CP,而Eureka则更偏向于AP。2. 在查询服务列表时,我们可以容忍注册中心返回的是几分钟前的...
[博学谷学习记录]超强总结,用心分享之Zookeeper学习笔记
ZooKeeper JavaAPI 操作 JavaAPI 包括 Curator、ZkClient 等,实现与 ZooKeeper 的连接、节点创建、查询、修改和删除等功能。Curator 项目提供了一种更简单的方法来实现 ZooKeeper 客户端操作,并支持 Watch 监听,用于处理节点状态变化事件。分布式锁概念与原理 分布式锁用于解决分布式集群环境下的数据同步问题...
5种微服务注册中心如何选型?从原理给你解读!
讲解5种常用的微服务注册中心,包括ETCD、Zookeeper、Eureka、Nacos和Consul,对比其流程和原理,为面试和选型提供帮助。注册中心主要有三种角色:服务注册、服务发现和配置管理。注册中心需要实现的功能包括:服务注册、服务发现、服务健康检查、动态配置管理和多数据中心支持。注册中心基础扫盲:CAP理论解释了...
Zookeeper(一)可以用来干什么?
本文作为Zookeeper的入门篇,主要从Node对象的角度讲解了Zookeeper可以用来干么。当然Node的设计还有更多可具体深入的地方。Zookeeper也不仅只有Node,还有更多值得我们学习的知识,例如:Watcher机制,如何保障事务的顺序一致性、集群间数据的一致性,以及必须要知道的ZAB协议等等。最后祝大家看完此文后能够有所...
Zookpeer是什么?在系统中如何起作用?
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。Zookeeper中的角色主要有以下三类:系统模型如图所示:Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分 别是恢复模式(选主)和广播模式(同步)。当...
Eureka和Zookeeper的区别(CAP原理)
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但...
如何深入理解分布式 CAP 原理?
由Eric Brewer在2000年提出,随后Seth Gilbert和Nancy Lynch的证实,这个理论将分布式系统的设计原则划分为三个关键要素:一致性(C)、可用性(A)和分区容错性(P)。CAP理论的核心在于,在面对分区时,系统往往被迫在保证C与P,或者A与P之间作出选择,这就像ZooKeeper(选择CP,如银行场景中的事务处理)与...
Zookeeper在哪些系统中使用,又是怎么用的
ZooKeeper作为发现服务的问题ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它 很成熟,有相当大的社区...
ZK的watch机制实现原理
ZK的watch机制实现原理。ZK的watch机制实现原理 我带来的是ZK的watch机制实现原理的相关话题,接下来我就来介绍。newZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher)这个Watcher将作为整个ZooKeeper会话期间的上下文,一直被保存在客户端ZKWatchManager的defaultWatcher 也可以动态添加watcher:getData...
大数据核心技术有哪些
大数据技术的体系庞大且复杂,基础的技术包含数据的采集、数据预处理、分布式存储、数据库、数据仓库、机器学习、并行计算、可视化等。1、数据采集与预处理:FlumeNG实时日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据;Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供数据同步...