ZooKeeper 概念与基础

信息飞速膨胀,不少应用没法依赖单个服务器处理庞大的数据量。因为分布式系统和应用能够提供更强的计算能力,还能更好地容灾和扩展,因此逐渐受到青睐。node

在开发分布式应用时,一般须要花费大量时间和精力来处理异构系统中的协做通讯问题。shell

什么是 ZooKeeper

ZooKeeper 专一于任务协做,能为大型分布式系统提供可靠的协做处理能力,简化开发流程,让开发人员更专一于应用自己的逻辑。数据库

ZooKeeper 具备 C-S 结构,在使用时,开发的应用能够看作为链接到 ZooKeeper 服务器的客户端,经过客户端 API 进行操做,保障强一致性、有序性和持久性,具备实现同步原语的能力,提供简单的并发处理机制。常见的用法如:选举主节点、崩溃检测、存储元数据等。apache

注意,ZooKeeper 不适用于海量信息存储,设计应用时最好将应用数据与协同数据分开,使用数据库、分布式文件系统等存储应用数据。数组

ZooKeeper 基础

由若干条指令组成,用于完成特定功能的过程称为原语。服务器

为了保证灵活性,ZooKeeper 不直接提供原语,而是暴露出相似文件系统的 API,让开发人员经过 API 实现本身的原语,一般使用菜谱( recipes )来表示原语的实现。session

ZooKeeper 操做和维护的为一个个数据节点,称为 znode,采用相似文件系统的层级树状结构进行管理。若是 znode 节点包含数据则存储为字节数组(byte array)。并发

API 概述

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 以前,须要 下载 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
相关文章
相关标签/搜索