Ⅳ.版本
在前面我们已经提到,Zookeeper 的每个 ZNode 上都会存储数据,对应于每个 ZNode,Zookeeper 都会为其维护一个叫作 Stat 的数据结构 。
Stat 中记录了这个 ZNode 的三个数据版本,分别是:
- version(当前 ZNode 的版本)
- cversion(当前 ZNode 子节点的版本)
- aversion(当前 ZNode 的 ACL 版本)
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性 。
ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性 。
Ⅵ.ACL
ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于 UNIX 文件系统的权限控制 。
ZooKeeper 定义了 5 种权限,如下图:

文章插图
其中尤其需要注意的是,CREATE 和 DELETE 这两种权限都是针对子节点的权限控制 。
三、ZooKeeper 特点ZooKeeper 有哪些特点呢?具体如下:
- 顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去 。
- 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用 。
- 单一系统映像:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的 。
- 可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖 。
四、ZooKeeper 设计目标Ⅰ.简单的数据模型
ZooKeeper 允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似 。
名称空间由 ZooKeeper 中的数据寄存器组成,称为 Znode,这些类似于文件和目录 。
与为存储设计的典型文件系统不同,ZooKeeper 数据保存在内存中,这意味着 ZooKeeper 可以实现高吞吐量和低延迟 。

文章插图
Ⅱ.可构建集群
为了保证高可用,最好是以集群形态来部署 ZooKeeper,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),那么 ZooKeeper 本身仍然是可用的 。
客户端在使用 ZooKeeper 时,需要知道集群机器列表,通过与集群中的某一台机器建立 TCP 连接来使用服务 。
客户端使用这个 TCP 链接来发送请求、获取结果、获取监听事件以及发送心跳包 。如果这个连接异常断开了,客户端可以连接到另外的机器上 。
ZooKeeper 官方提供的架构图:

文章插图
上图中每一个 Server 代表一个安装 ZooKeeper 服务的服务器 。组成 ZooKeeper 服务的服务器都会在内存中维护当前的服务器状态,并且每台服务器之间都互相保持着通信 。
集群间通过 Zab 协议(Zookeeper Atomic Broadcast)来保持数据的一致性 。
Ⅲ.顺序访问
对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增编号 。
这个编号反应了所有事务操作的先后顺序,应用程序可以使用 ZooKeeper 这个特性来实现更高层次的同步原语 。这个编号也叫做时间戳—zxid(ZooKeeper Transaction Id) 。
Ⅳ.高性能
ZooKeeper 是高性能的 。在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态 。(“读”多于“写”是协调服务的典型场景 。)

文章插图
六、ZooKeeper 集群角色介绍最典型集群模式:Master/Slave 模式(主备模式) 。在这种模式中,通常 Master 服务器作为主服务器提供写服务,其他的 Slave 服务器从服务器通过异步复制的方式获取 Master 服务器最新的数据提供读服务 。
但是,在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了Leader、Follower 和 Observer 三种角色 。
如下图所示:

文章插图
ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器 。
Leader 既可以为客户端提供写服务又能提供读服务 。除了 Leader 外,Follower 和 Observer 都只能提供读服务 。
推荐阅读
- java反射机制
- 互联网前端开发技术之JavaScript JSON语法详解
- 5大常用jquery插件,JavaScript框架小常识
- 2019 年常用 JavaScript 正则大全
- java生成微信小程序二维码
- 十年技术大牛总结:分布式架构之日志技术
- 图解 Java 垃圾回收机制,写得非常好
- 一文读懂 JavaScript 和 ECMAScript 的区别
- 阿里技术大牛:一份架构师成神路线图
- 看看顶级互联网公司都在研究的无服务器架构,看完收获满满
