信息飞速膨胀,不少应用没法依赖单个服务器处理庞大的数据量。因为分布式系统和应用能够提供更强的计算能力,还能更好地容灾和扩展,因此逐渐受到青睐。node
在开发分布式应用时,一般须要花费大量时间和精力来处理异构系统中的协做通讯问题。shell
ZooKeeper 专一于任务协做,能为大型分布式系统提供可靠的协做处理能力,简化开发流程,让开发人员更专一于应用自己的逻辑。数据库
ZooKeeper 具备 C-S 结构,在使用时,开发的应用能够看作为链接到 ZooKeeper 服务器的客户端,经过客户端 API 进行操做,保障强一致性、有序性和持久性,具备实现同步原语的能力,提供简单的并发处理机制。常见的用法如:选举主节点、崩溃检测、存储元数据等。apache
注意,ZooKeeper 不适用于海量信息存储,设计应用时最好将应用数据与协同数据分开,使用数据库、分布式文件系统等存储应用数据。数组
由若干条指令组成,用于完成特定功能的过程称为原语。服务器
为了保证灵活性,ZooKeeper 不直接提供原语,而是暴露出相似文件系统的 API,让开发人员经过 API 实现本身的原语,一般使用菜谱( recipes )来表示原语的实现。session
ZooKeeper 操做和维护的为一个个数据节点,称为 znode,采用相似文件系统的层级树状结构进行管理。若是 znode 节点包含数据则存储为字节数组(byte array)。并发
ZooKeeper 暴露以下 API:分布式
create /path data
建立节点并包含数据delete /path
删除节点exists /path
检查节点是否存在setData /path data
设置节点数据getData /path
获取节点数据getChildren /path
获取子节点列表ZooKeeper 不容许局部读取或写入数据,读取时会将节点数据所有读取,写入时会整个替换。ui
建立 znode 时须要指定节点类型,节点的类型会影响其行为方式。
znode 分为持久节点和临时节点。持久节点只有经过调用 delete API 才能删除;临时节点在客户端崩溃或关闭与 ZooKeeper 服务器链接时就会被删除,调用 delete API 也能删除临时节点。
znode 可设置为有序节点。有序节点在建立时会分配一个整数序号追加到路径以后,如建立 /tasks/task- 有序节点,追加整数后节点路径为 /tasks/task-1 。
综上,znode 共有 4 种类型,分别为:持久(无序)、临时(无序)、持久有序和临时有序。
ZooKeeper 一般以远程服务的方式被访问,在数据不发生变化时频繁地访问代价较大,ZooKeeper 的通知机制能够代替客户端的轮训。
客户端经过设置监视点(watcher)向 ZooKeeper 注册须要接收通知的 znode,在 znode 发生变化时 ZooKeeper 向客户端发送消息。
通知机制是单次触发的操做,如需不断监听 znode 的变化,须要在接收到 znode 变动时设置新的监视点。
监视点有多种类型,如监控 znode 数据变化、监控 znode 子节点变化、监控 znode 建立或删除。
每一个 znode 都有一个随数据变化而自增的版本号,多个写入操做会有条件的执行。写入操做会将版本号做为参数,当与服务器上版本号一致时才会调用成功,这点在多个客户端对同一个 znode 进行操做时很重要。
只有一台单独的 ZooKeeper 服务器时为独立模式,状态没法复制。具备一组 ZooKeeper 服务器时为仲裁模式,仲裁模式下各个服务器间进行状态的复制,同时服务于客户端的请求。
仲裁模式下,若是让客户端等待全部服务器完成数据保存再继续,延迟问题就会很大,ZooKeeper 经过法定人数肯定工做时必须有效运行的服务器最小数量。若是有 5 台服务器,任意 3 台服务器保存了数据,客户端就能够继续工做。其余 2 台服务器最终也会捕获到数据进行保存。
服务器的个数应该为奇数,若有 5 台服务器,则最多容许 2 台崩溃。假如服务器个数为偶数,容许崩溃的服务器数量不会增长,法定人数却更大,须要更多的确认操做。
开始使用 ZooKeeper 以前,须要 下载 ZooKeeper 发行包 。解压 tar 格式的压缩文件,bin 目录下有启动 ZooKeeper 的脚本,conf 目录下存放着 ZooKeeper 的配置文件,lib 目录下存放着一些运行所需的第三方文件。
在 ZooKeeper 目录下执行如下命令启动 ZooKeeper 服务器。
$ bin/zkServer.sh start
$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /test "" Created /test [zk: localhost:2181(CONNECTED) 2] ls / [zookeeper, test]
[zk: localhost:2181(CONNECTED) 3] delete /test [zk: localhost:2181(CONNECTED) 4] ls / [zookeeper]
[zk: localhost:2181(CONNECTED) 5] quit Quitting... 2018-05-02 15:58:34,004 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x1630a0cdc400001 closed 2018-05-02 15:58:34,006 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x1630a0cdc400001
$ bin/zkServer.sh stop