什么是Zookeeper

官方定义:

他是用来管大象(hadoop),密封(Hive),小猪(pig)的管理员,Apache Hbase和Apache Solr以及阿里的Dubbo等项目中都采用到了zookeeper。
一句话:Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调(Coordination)服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件,它是一个为分布式应用提供一致性服务的软件

从设计模式的角度理解

是一个基于观察模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。

一句话总结

**Zookeeper = 文件系统 + 通知机制

Zookeeper能干吗

  • 命名服务
  • 配置维护
  • 集群管理
  • 分布式消息同步和协调机制
  • 负载均衡
  • 对Dubbo的支持

Zookeeper提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,作为分布式系统的沟通调度桥梁

Zookeeper 安装配置参考:**Zookeeper 单机 & 集群搭建


ZNode 深入理解

ZNode 数据模型

ZNode 是什么

Znode维护了一个stat结构,这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起,可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化,版本号就增加。
例如:无论何时客户端检索数据,它也一起检索数据的版本号。并且当客户端执行更新或删除时,客户端必须提供他正在改变的znode的版本号。如果它提供的版本号和真实的数据版本号不一致,更新将会失败。

ZNode stat 结构体

  • czxid- 引起这个znode创建的zxid,创建节点的事务zxid(Zookeeper Transaction Id)
    • 每次修改Zookeeper状态都会收到一个zxid形式的时间戳,也就是Zookeeper事务ID。事务ID是Zookeeper中所有修改总的次序,每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
  • ctime - znode被创建的毫秒数(从1970年开始)
  • mzxid - znode最后更新的zxid
  • mtime - znode最后修改的毫秒数(从1970年开始)
  • pZxid - znode最后更新子节点zxid
  • cversion - znode子节点变化号,znode子节点修改次数
  • dataversion - znode数据变化号
  • aclVersion - znode访问控制列表的变化号
  • ephemeralOwner - 如果是临时节点,这个是znode拥有者的session id,如果不是临时节点则是0
  • datalength - znode的数据长度
  • numChildren - znode子节点数量

    总结

    zookeeper内部维护了一套类似Unix的树形数据结构;
    由znode构成的集合,
    znode的集合又是一个树形结构;
    每一个znode又有很多属性进行描述。Znode = path + nodeValue + Stat

    ZNode 的四种类型

    PERSISTENT - 持久化目录节点

    创建这个节点的客户端与zookeeper断开连接后,该节点不会被删除(除非使用API强制删除)

    PERSISTENT_SEQUENTIAL - 持久化顺序编号目录节点

    持久化顺序编号节点,当客户端请求创建这个节点后,Zookeeper会根据parent-znode的zxid状态,为这个节点编写一个全目录唯一的编号(这个编号只会一直增长),当客户端与Zookeeper断开连接之后,这个节点也不会删除

    EPHEMERAL - 临时目录节点

    创建这个节点的客户端与zookeeper断开连接后,该节点(以及子节点)被删除

    EPHEMERAL_SEQUENTIAL - 临时顺序编号目录节点

    临时顺序编号节点,当客户端请求创建这个节点后,Zookeeper会根据parent-znode的zxid状态,为这个节点编写一个全目录唯一的编号(这个编号只会一直增长),当客户端与Zookeeper断开连接之后,这个节点会删除
    另外,无论是 EPHEMERAL 还是 **EPHEMERAL_SEQUENTIAL 节点类型,在Zookeeper的client异常中断之后,节点就会被删除。**

zkCli 的基础命令

一句话: 与 Redis的key/value键值对类似,只不过在ZK中,key 是 路径, value 是 data

常用命令

  • help
  • ls: 使用ls命令来查看当前znode中所包含的内容
  • ls2: 查看当前节点数据并能看到更新次数等数据
  • stat
  • set
  • get
  • create
  • delete
  • rmr

    Zookeeper的四字命令

    zookeeper支持某些特定的四字命令,他们大多是用来查询zk服务的当前状态及相关信息的,通过telnet或nc向zookeeper提交相应命令,如: echo ruok | nc 127.0.0.1 2181

    运行公式: echo 四字命令 | nc 主机ip zookeeper端口
    image.png

    常用的四字命令

  • ruok: 测试服务是否处于正确状态,如果确实如此,那么服务返回“imok”,否则不做任何响应

  • stat: 输出关于性能和连接的客户端的列表
  • conf:输出相关服务配置的详细信息
  • cons:列出所有连接到服务器的客户端的完全的连接/会话的详细信息。包括“接受/发送”的包数量、会话
  • dump:列出未经处理的会话和临时节点
  • envi:输出关于服务环境的详细信息(区别于conf命令)
  • reqs:列出未经处理的请求
  • wchs:列出服务器watch的详细信息
  • wchc:通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表
  • wchp:通过路径列出服务器watch的详细信息。它输出一个与session相关的路径