一、简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本
二、为什么要使用zk
1.应用或多或少都有一些配置信息,如果应用部署在多台机器上,一旦涉及修改配置参数,我们需要到各个机器上一个一个修改,重复工作且容易出错,可以将配置信息放在zookeeper上,应用监听对应节点数据,一旦配置信息发生变化,zookeeper会通知应用进行变更
2.涉及多个系统调用,如果一个系统地址变更,需要同时通知所有调用方,可以将服务注册在zookepper上,调用该系统服务的系统只需要监听对应节点数据,即可获取最新地址进行调用,dubbo使用zookeeper来注册服务
三、数据模型和分层命名空间
ZooKeeper提供的名称空间非常类似于标准文件系统。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper名称空间中的每个节点都由路径标识。与标准文件系统不同的是,ZooKeeper命名空间中的每个节点都可以包含与之关联的数据以及子项。节点既可以是一个文件也可以是一个目录的文件系统。(ZooKeeper旨在存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点的数据通常很小,在字节到千字节范围内。)我们使用术语 znode来表明我们正在谈论ZooKeeper数据节点。
我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
三、四种类型的znode
1、PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
可以根据不同的业务场景进行选择使用不同的znode
四、通知机制
这个是zk的一个重要机制,客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
五、zk保证
ZooKeeper非常快速且非常简单。但是,由于其目标是构建更复杂的服务(如同步)的基础,因此它提供了一系列保证。这些是:
1.顺序一致性 - 客户端的更新将按发送顺序应用。
2.原子性 - 更新成功或失败。没有部分结果。
3.单系统映像 - 无论服务器连接到哪个服务器,客户端都将看到相同的服务视图。
4.可靠性 - 一旦应用了更新,它将从那时起持续到客户端覆盖更新。
5.及时性 - 系统的客户视图保证在特定时间范围内是最新的。