一篇文章带您掌握ZooKeeper的基础概念
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章带您掌握ZooKeeper的基础概念相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
一篇文章带您掌握ZooKeeper的基础概念
01 ZooKeeper 是什么?
ZooKeeper是一款开源的分布式服务协调中间件,采用统一的协调管理方式来协调分布式系统中各个子系统,从而让开发将更多的精力放在业务逻辑中。
02 ZooKeeper的功能特性是什么?
-
【顺序一致性】:从同一个客户端发起的事务请求,最终将会严格地按照顺序被应用到ZooKeeper上;
-
【原子性】: 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功某一个事务请求,要么就失败;
-
【单一系统映像】: 无论客户端链接到那个ZooKeeper上,其看到的服务端数据模型都是一样的;
-
【可靠性】: 一旦一次更改请求被应用,就会持久化,直到被下次更改所覆盖;
03 zookeeper如何保证顺序一致性的?
zookeeper 采用了递增的事务 Id 来标识,所有的 proposal(提议)都在被提 出的时候加上了 zxid,zxid 实际上是一个 64 位的数字,高 32 位是 epoch(时 期; 纪元; 世; 新时代)用来标识 leader 是否发生改变,如果有新的 leader产生出来,epoch 会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求, 如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
04 ZooKeeper的数据结构?
ZooKeeper将所有数据存储在内存中,最终构成的数据结构可以看成一棵树(ZNode Tree),由斜杠进行分割,分割之后每个节点即为路径,每个路径对应的即为一个ZNode,例:ZNode1/Znode1,每个节点都会保存自己的数据内容及一系列属性信息,并每个节点的存放数据上限为 1M。
05 ZooKeeper的四种ZNode
-
【持久化节点】:即一旦这种ZNode被创建,除非主动移除,否则它将一直保存在ZooKeeper上;
-
【顺序自动编号持久化节点】:在【持久化节点】这种节点会根据当前已存 在的节点数自动加 1;
-
【临时节点】: 即生命周期和客户端的会话绑定在一起,客户端会话超时这类节点就会自动删除;
-
【临时自动编号节点】:在【临时节点】的基础上,根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
06 ZooKeeper的watcher 事件是什么?
即"事件监听器",即在指定的节点ZNode上注册"监听"事件,当该节点触发一些特定的事件时,zookeeper服务端会将事件通知到指定的客户端Client上,从而让客户端做出相对应的措施。
简单来说、client 端对某个 ZNode建立一个 watcher 事件,只有当该 ZNode发生变化时,zookeeper主动通知 watch 这个 ZNode的 client端,从而让客户端做出相对应的措施 。
07 watcher的特点
- 【轻量级】:一个 callback 函数;
- 【异步性】:不会 block 正常的读写请求;
- 【主动推送】:Watch 被触发时,由 Zookeeper 服务端主动将更新推送给客
户端; - 【一次性】:数据变化时,Watch 只会被触发一次。如果客户端想得到后续更
新的通知,必须要在 Watch 被触发后重新注册一个 Watch; - 【仅通知】:仅通知变更类型,不附带变更后的结果;
- 【顺序性】 :如果多个更新触发了多个 Watch,那 Watch 被触发的顺序与更新顺序一致;
注:由于 watcher 是一次性的,所以需要自己去实现永久 watch、 如果被 watch 的节点频繁更新,会出现“丢数据”的情况,同时 watcher 数量过多也会导致性能下降。
08 ZooKeeper 的应用场景
- 【统一命名服务】:通过给ZNode进行统一命名,各个子系统便可以通过名字获取到该节点上相应的资源
- 【统一配置管理】:将每个子系统都需要配置的文件统一放在一个ZooKeeper的ZNode节点中
- 【分布式锁】:控制多线程对共享资源的并发访问
- 【集群状态】:通过动态节点的增加、删除、从而保证集群下的相关节点数据主、副本的一致性。
以上是关于一篇文章带您掌握ZooKeeper的基础概念的主要内容,如果未能解决你的问题,请参考以下文章